Obtendo o nome do arquivo binário antes do download em C #
-
27-10-2019 - |
Pergunta
Primeiro, deixe-me descrever a situação. Meu aplicativo em C # pede ao servidor PHP a atualização mais recente.Ele usa sua URL e atributos de POST simples como: 127.0.0.1/update.php?ver=0.2, o servidor responde com 404 se nunca houver uma versão que 0.2 e com 200 OK quando há uma versão mais recente e começa a enviar o arquivo binárioem mime-type: octet-stream.
Não tenho problemas para obter este arquivo, mas estou tendo problemas para obter seu nome de arquivo.
Com este código:
WebClient webClient = new WebClient();
webClient.DownloadFile("http://127.0.0.1/update.php?ver=0.2", filename);
Tenho que colocar meu nome do arquivo , mas e se eu quiser que ele tenha O MESMO NOME como o arquivo no servidor?Como posso obtê-lo antes de fazer o download?
Solução
Se você usar OpenRead()
, poderá ver se há um valor para webClient.ResponseHeaders["content-disposition"]
e analisar a parte filename="blah.blah".
No entanto, a grande maioria dos streams na web não tem informações de nome de arquivo e, quando for enviado, você pode reescrever a extensão do arquivo com base no tipo de conteúdo para que a extensão do arquivo corresponda ao mapeamento nomáquina em que está sendo salvo.
Outras dicas
Isso não é diretamente possível porque WebClient
oferece funcionalidade de alto nível que não se adapta muito bem a esses cenários.
Existem várias abordagens que você pode adotar, mas todas exigem alterações de um tipo ou outro.Aqui estão algumas:
- Você pode dividir a funcionalidade em duas partes: fazer uma chamada (por exemplo, com
DownloadString
) que informa se há uma atualização e qual é o seu nome, então chameDownloadFile
para obter a atualização em si,saber o nome. - Desista da conveniência de
DownloadFile
e manipule a solicitação HTTP em um nível inferior;faça isso para poder ler os cabeçalhos de resposta HTTP e adicionar um cabeçalho (pode ser qualquer coisa, você pode até mesmo inventar um como, por exemplo,X-Save-Filename:
) que informa qual nome de arquivo deve ser.