Un problema con la relativa risoluzione del percorso quando si imposta una sorgente di immagini

StackOverflow https://stackoverflow.com/questions/2020984

Domanda

Ho creato una piccola applicazione WPF che permette agli utenti di caricare i documenti e quindi selezionare una per visualizzare.

Il seguente è il codice per la copia dei file.

    
public static void MoveFile( string directory, string subdirectory)
{
    var open = new OpenFileDialog {Multiselect = false, Filter = "AllFiles|*.*"};
    var newLocation = CreateNewDirectory( directory, subdirectory, open.FileName);

    if ((bool) open.ShowDialog())
        CopyFile(open.FileName, newLocation);
    else
        "You must select a file to upload".Show();
}

private static void CopyFile( string oldPath, string newPath)
{
 if(!File.Exists(newPath))
  File.Copy(oldPath, newPath);
 else
  string.Format("The file {0} already exists in the current directory.", Path.GetFileName(newPath)).Show();
}
    

Il file viene copiato senza incidenti. Tuttavia, quando l'utente tenta di selezionare un file semplicemente copiato per visualizzare un file non trovato eccezione. Dopo il debug, ho trovato che l'UriSource per l'immagine dinamica sta risolvendo il 'file {file selezionato}' relative percorso alla directory che è stato appena navigato dal file selezionate nel codice al posto della directory dell'applicazione di cui sopra come sembra dovrebbe.

Questo problema si verifica solo quando si seleziona un file appena copiato. Se si riavvia l'applicazione e selezionare il nuovo file funziona benissimo.

Ecco il codice che imposta dinamicamente la fonte immagine:

    
//Cover = XAML Image
Cover.Source(string.Format(@"Files\{0}\{1}", item.ItemID, item.CoverImage), "carton.ico");

...

public static void Source( this Image image, string filePath, string alternateFilePath)
{
    try
 {image.Source = GetSource(filePath);}
    catch(Exception)
 {image.Source = GetSource(alternateFilePath);}
}

private static BitmapImage GetSource(string filePath)
{
    var source = new BitmapImage();
    source.BeginInit();
    source.UriSource  = new Uri( filePath, UriKind.Relative);
    //Without this option, the image never finishes loading if you change the source dynamically.
    source.CacheOption = BitmapCacheOption.OnLoad;
    source.EndInit();
    return source;
}
    

Sono perplesso. Qualsiasi pensiero sarebbe apprezzato.

È stato utile?

Soluzione 2

Si scopre che mi mancava un'opzione nel costruttore della mia openfiledialogue. Il dialogo è stato cambiando la directory corrente, che stava causando il percorsi relativi per risolvere in modo non corretto.

Se si sostituisce il file aperto con il seguente:


var open = new OpenFileDialog{ Multiselect = true, Filter = "AllFiles|*.*", RestoreDirectory = true};

Il problema è stato risolto.

Altri suggerimenti

Anche se non ho una risposta diretta, si dovrebbe prestare attenzione per queste persone che permettono di caricare i file. Ero ad un seminario dove avevano buon vs cattivi hacker per simulare exploit di vita reale. Uno era tale che i file sono stati autorizzati a caricare. Hanno caricato i file asp.net dannosi e chiamati i file direttamente come nuova in cui le immagini sono state infine presentate agli utenti, e sono stati in grado di prendere in consegna alla fine di un sistema. Si consiglia di verificare in qualche modo quali tipi di file vengono ammessi e forse hanno memorizzato in una directory non exeucting del server web.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top