Für ein neues Fenster, das sich während des Downloads öffnet und nach dem Download geschlossen werden muss: Dies ist bei kleineren Dateien wirksam:
System.IO.FileInfo file = new System.IO.FileInfo("F:\mp3\mp3\Weine nicht, meine Lieblingsperson.mp3");
Response.Clear();
Response.ClearHeaders();
Response.Buffer = false;
Response.Charset="GB2312";
Response.ContentEncoding=System.Text.Encoding.UTF8;
Response.ContentType = "application/octet-stream";
Response.AddHeader("Content-Disposition", "attachment; filename="+Server.UrlEncode("Weine nicht, meine Lieblingsperson.mp3"));
Response.AddHeader("Content-Length", file.Length.ToString());
Response.WriteFile(file.FullName);
Response.Flush();
Response.End();
Dieser Code kann die Datei ausgeben und das neu geöffnete Formular schließen.
Für große Dateien ist es nicht besser, den obigen Code zu verwenden, da der obige Code ausgegeben wird, nachdem alle Dateien auf dem Server zwischengespeichert wurden. Wenn auf Ihrem Server viel Datenverkehr herrscht und die Datei groß ist, wird die Verwendung der oben genannten Methode nicht empfohlen .
Ich habe Folgendes getestet und es scheint besser zu funktionieren:
public static bool ResponseFile(HttpRequest _Request,HttpResponse _Response,string _fileName,string _fullPath, long _speed)
{
versuchen
{
FileStream myFile = new FileStream(_fullPath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
BinaryReader br = new BinaryReader(myFile);
versuchen
{
_Response.AddHeader("Accept-Ranges", "bytes");
_Response.Buffer = false;
long fileLength = myFile.Length;
lange startBytes = 0;
int pack = 10240; //10K Bytes
int sleep = (int)Math.Floor(1000 * pack / _speed) + 1;
if (_Request.Headers["Range"] != null)
{
_Response.StatusCode = 206;
string[] range = _Request.Headers["Range"].Split(new char[] {'=', '-'});
startBytes = Convert.ToInt64(range[1]);
}
_Response.AddHeader("Content-Length", (fileLength - startBytes).ToString());
if (startBytes != 0)
{
_Response.AddHeader("Content-Range", string.Format(" bytes {0}-{1}/{2}", startBytes, fileLength-1, fileLength));
}
_Response.AddHeader("Connection", "Keep-Alive");
_Response.ContentType = "application/octet-stream";
_Response.AddHeader("Content-Disposition","attachment;filename=" + 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++)
{
if (_Response.IsClientConnected)
{
_Response.BinaryWrite(br.ReadBytes(pack));
Thread.Sleep(sleep);
}
anders
{
i=maxCount;
}
}
_Response.Flush();
}
fangen
{
return false;
}
Endlich
{
br.Close();
myFile.Close();
}
}
fangen
{
return false;
}
return true;
}
Diese Art von Code ist auch im Internet verfügbar. Er kann auch Dateien ausgeben und das neu geöffnete Fensterformular schließen.
Außerdem wurde beim Test festgestellt, dass einige unerwartete Dinge passieren, wenn die Betriebssysteme des Servers und des Clients Im Allgemeinen ist es unterschiedlich: Wenn der obige Code nicht normal geschlossen werden kann, können Sie die Browsereinstellungen unter „Erweitert“ überprüfen.
Darüber hinaus können Sie verschiedene Ausgabeinhaltstypen Response.ContentType = "application/octet-stream"; ändern, da unterschiedliche Inhaltstypen auf der Clientseite möglicherweise unterschiedlich interpretiert werden.
Wenn Sie Ideen haben, antworten Sie bitte.
http://www.cnblogs.com/tour-code/archive/2006/10/25/539257.html