response.setheader("content-disposition", "attachment; filename=" + java.net.urlencoder.encode(filename, "utf-8"));
下載的程式裡有了這句,一般在ie6的下載提示框上將正確顯示檔案的名字,無論是簡體中文,還是日文。不過當時確實沒有仔細測試檔案名很長的中文檔案名稱。先如今經過仔細測試,發現文字只要超過17個字,就不能下載了。經過好一番google和反覆測試,總算對這個問題有了系統的認識
public partial class filedownload : system.web.ui.page
{
//提供下載的檔案,不編碼的話檔案名稱會亂碼
private string filename = httpcontext.current.server.urlencode("規範.rar");
private string filepath = httpcontext.current.server.mappath("規範.rar");
//使用transmiffile下載檔案
protected void btndl1_click(object sender, eventargs e)
{
fileinfo info = new fileinfo(filepath);
long filesize = info.length;
response.clear();
response.contenttype = "application/x-zip-compressed";
response.addheader("content-disposition", "attachment;filename="+ filename);
//不指明content-length用flush的話不會顯示下載進度
response.addheader("content-length", filesize.tostring());
response.transmitfile(filepath, 0, filesize);
response.flush();
response.close();
}
//使用writefile下載檔案
protected void btndl2_click(object sender, eventargs e)
{
fileinfo info = new fileinfo(filepath);
long filesize = info.length;
response.clear();
response.contenttype = "application/octet-stream";
response.addheader("content-disposition", "attachement;filename=" + filename);
//指定檔案大小
response.addheader("content-length", filesize.tostring());
response.writefile(filepath, 0, filesize);
response.flush();
response.close();
}
//使用outputstream.write分塊下載檔案
protected void btndl3_click(object sender, eventargs e)
{
//指定塊大小
long chunksize = 102400;
//建立一個100k的緩衝區
byte[] buffer = new byte[chunksize];
//已讀的位元組數
long datatoread = 0;
filestream stream = null;
try
{
//開啟檔案
stream = new filestream(filepath, filemode.open, fileaccess.read, fileshare.read);
datatoread = stream.length;
//添加http頭
response.contenttype = "application/octet-stream";
response.addheader("content-disposition", "attachement;filename=" + filename);
response.addheader("content-length", datatoread.tostring());
while (datatoread > 0)
{
if (response.isclientconnected)
{
int length = stream.read(buffer, 0, convert.toint32(chunksize));
response.outputstream.write(buffer, 0, length);
response.flush();
response.clear();
datatoread -= length;
}
else
{
//防止client失去串連
datatoread = -1;
}
}
}
catch (exception ex)
{
response.write("error:" + ex.message);
}
finally
{
if (stream != null)
{
stream.close();
}
response.close();
}
}
//使用binarywrite下載檔案,大檔案效率不行
protected void btndl4_click(object sender, eventargs e)
{
filestream stream = null;
try
{
//讀檔案,大檔案一次讀入會佔用大量記憶體
stream = new filestream(filepath, filemode.open, fileaccess.read, fileshare.read);
byte[] bytes = new byte[stream.length];
stream.read(bytes, 0, bytes.length);
stream.close();
//添加http頭
response.contenttype = "application/octet-stream";
response.addheader("content-disposition", "attachement;filename=" + filename);
response.addheader("content-length", bytes.length.tostring());
response.binarywrite(bytes);
response.flush();
}
catch (exception ex)
{
response.write("error:" + ex.message);
}
finally
{
if (stream != null)
{
stream.close();
}
response.close();
}
}
//使用binarywrite分塊下載檔案
protected void btndl5_click(object sender, eventargs e)
{
//指定區塊和緩衝區
long chunksize = 102400;
byte[] buffer = new byte[chunksize];
filestream stream = null;
long datatoread = 0;
try
{
stream = new filestream(filepath, filemode.open, fileaccess.read, fileshare.read);
datatoread = stream.length;
//添加http頭
response.contenttype = "application/octet-stream";
response.addheader("content-disposition", "attachement;filename=" + filename);
response.addheader("content-length", datatoread.tostring());
while (datatoread > 0)
{
if (response.isclientconnected)
{
int length = stream.read(buffer, 0, convert.toint32(chunksize));
response.binarywrite(buffer);
response.flush();
response.clear();
datatoread -= length;
}
else
{
datatoread = -1;
}
}
}
catch(exception ex)
{
response.write("error:" + ex.message);
}
finally
{
if (stream != null)
{
stream.close();
}
response.close();
}
}
}