Un problème avec la résolution de chemin relatif lors de la définition d'une source d'image

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

Question

Je l'ai construit une petite application WPF qui permet aux utilisateurs de télécharger des documents, puis sélectionnez un à afficher.

Ce qui suit est le code pour la copie de fichiers.

    
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();
}
    

Le fichier est copié sans incident. Cependant, lorsque l'utilisateur tente de sélectionner un fichier qu'ils viennent d'être copiés pour afficher un fichier non trouvé exception. Après le débogage, j'ai trouvé que le UriSource pour l'image dynamique résout le chemin relatif « Fichiers {fichier sélectionné} » dans le répertoire qui vient d'être broutées par le fichier sélectionné dans le code ci-dessus au lieu du répertoire de l'application comme il semble que il se doit.

Ce problème se produit uniquement lorsqu'un nouveau fichier copié est sélectionné. Si vous redémarrez l'application et sélectionnez le nouveau fichier, il fonctionne très bien.

Voici le code qui définit dynamiquement la source de l'image:

    
//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;
}
    

Je suis perplexe. Toute pensée de serait apprécié.

Était-ce utile?

La solution 2

Il se trouve que je manque une option dans le constructeur de mon openfiledialogue. Le dialogue a été en train de changer le répertoire courant qui a été à l'origine des chemins relatifs à résoudre de manière incorrecte.

Si vous remplacez le fichier ouvert avec les éléments suivants:


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

Le problème est résolu.

Autres conseils

Bien que je n'ai pas une réponse directe, vous devez faire preuve de prudence pour ces personnes permettant de télécharger des fichiers. J'étais à un séminaire où ils avaient bon contre mauvais hackers pour simuler les exploits de la vie réelle. L'un était tel que les fichiers ont été autorisés à être téléchargés. Ils fichiers téléchargés de asp.net malveillants et ont appelé les fichiers directement comme ils nouvelle où les images ont été présentées en fin de compte aux utilisateurs, et ont pu éventuellement prendre en charge un système. Vous pouvez vérifier en quelque sorte quels types de fichiers sont autorisés et peut-être ont stocké dans un répertoire non exeucting de votre serveur Web.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top