Para uma nova janela que abre durante o download e precisa ser fechada após o download: é eficaz para arquivos menores:
System.IO.FileInfo file = new System.IO.FileInfo("F:\mp3\mp3\Não chore minha pessoa favorita.mp3");
Response.Clear();
Response.ClearHeaders();
Resposta.Buffer = falso;
Response.Charset="GB2312";
Response.ContentEncoding=System.Text.Encoding.UTF8;
Response.ContentType = "aplicativo/fluxo de octetos";
Response.AddHeader("Content-Disposition", "attachment; filename="+Server.UrlEncode("Não chore minha pessoa favorita.mp3"));
Response.AddHeader("Comprimento do conteúdo", arquivo.Length.ToString());
Response.WriteFile(arquivo.NomeCompleto);
Response.Flush();
Response.End();
Este código pode gerar o arquivo e fechar o formulário recém-aberto.
Para arquivos grandes, não é melhor usar o código acima, porque o código acima é gerado depois que todos os arquivos são armazenados em cache no servidor. Se o seu servidor tiver tráfego intenso e o arquivo for grande, não é recomendado usar o método acima. .
Eu testei o seguinte e parece funcionar melhor:
public static bool ResponseFile(HttpRequest _Request,HttpResponse _Response,string _fileName,string _fullPath, long _speed)
{
tentar
{
FileStream meuArquivo = novo FileStream(_fullPath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
BinaryReader br = new BinaryReader(meuArquivo);
tentar
{
_Response.AddHeader("Intervalos de aceitação", "bytes");
_Response.Buffer = falso;
comprimento do arquivo longo = meuArquivo.Comprimento;
startBytes longos = 0;
pacote interno = 10240; //10K bytes
int sleep = (int)Math.Floor(1000 * pack / _speed) + 1;
if (_Request.Headers["Range"] != null)
{
_Response.StatusCode = 206;
string[] intervalo = _Request.Headers["Range"].Split(new char[] {'=', '-'});
startBytes = Convert.ToInt64(intervalo[1]);
}
_Response.AddHeader("Content-Length", (fileLength - startBytes).ToString());
se (startBytes! = 0)
{
_Response.AddHeader("Content-Range", string.Format(" bytes {0}-{1}/{2}", startBytes, fileLength-1, fileLength));
}
_Response.AddHeader("Conexão", "Keep-Alive");
_Response.ContentType = "aplicativo/fluxo de octetos";
_Response.AddHeader("Disposição de conteúdo","anexo;nome do arquivo=" + HttpUtility.UrlEncode(_fileName,System.Text.Encoding.UTF8) );
br.BaseStream.Seek(startBytes, SeekOrigin.Begin);
int maxCount = (int) Math.Floor((fileLength - startBytes) / pack) + 1
for (int i = 0; i < maxCount; i++)
{
se (_Response.IsClientConnected)
{
_Response.BinaryWrite(br.ReadBytes(pacote));
Thread.Sleep(dormir);
}
outro
{
i=maxContagem;
}
}
_Response.Flush();
}
pegar
{
retornar falso;
}
finalmente
{
br.Fechar();
meuArquivo.Close();
}
}
pegar
{
retornar falso;
}
retornar verdadeiro;
}
Este tipo de código também está disponível na Internet. Ele também pode gerar arquivos e fechar a janela recém-aberta.
Além disso, durante o teste, descobriu-se que algumas coisas inesperadas aconteceriam se os sistemas operacionais do servidor e do cliente. são diferentes. De modo geral, usando Se o código acima não puder ser fechado normalmente, você pode verificar as configurações do navegador em Avançado.
Além disso, você pode modificar diferentes tipos de conteúdo de saída Response.ContentType = "application/octet-stream" porque diferentes tipos de conteúdo podem ser interpretados de maneira diferente no lado do cliente.
Se você tiver alguma idéia, responda. Discussões são bem-vindas.
http://www.cnblogs.com/tour-code/archive/2006/10/25/539257.html