Pergunta

Eu criei um pequeno aplicativo WPF que permite aos usuários fazer upload de documentos e selecionar um para exibir.

A seguir, o código para a cópia do arquivo.

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

O arquivo é copiado sem incidentes. No entanto, quando o usuário tenta selecionar um arquivo que eles acabaram de copiar para exibir, um arquivo não encontrou exceção. Após a depuração, descobri que o Urisource para a imagem dinâmica está resolvendo os arquivos relativos 'Arquivos {selecionados}' para o diretório que foi navegado pelo arquivo selecionado no código acima, em vez do diretório de aplicativos, pois parece que parece que parece deveria.

Esse problema ocorre apenas quando um arquivo recém -copiado é selecionado. Se você reiniciar o aplicativo e selecionar o novo arquivo, ele funciona bem.

Aqui está o código que define dinamicamente a fonte da imagem:

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

Estou perplexo. Qualquer pensamento seria apreciado.

Foi útil?

Solução 2

Acontece que eu estava perdendo uma opção no construtor do meu OpenFiledialogue. O diálogo estava mudando o diretório atual, que estava fazendo com que os caminhos relativos resolvam incorretamente.

Se você substituir o arquivo aberto pelo seguinte:


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

O problema é resolvido.

Outras dicas

Embora eu não tenha uma resposta direta, você deve ter cuidado para que as pessoas permitam que o upload de arquivos. Eu estava em um seminário onde eles tinham bons hackers bons contra simular explorações da vida real. Um era tal que os arquivos foram autorizados a ser carregados. Eles carregaram arquivos maliciosos do ASP.NET e ligaram diretamente para os arquivos, pois são novos onde as imagens foram apresentadas aos usuários, e conseguiram eventualmente assumir um sistema. Você pode verificar de alguma forma quais tipos de arquivos estão sendo permitidos e talvez tenham armazenado em um diretório não excitante do seu servidor da Web.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top