asp.net支援中文名字檔案下載代碼

來源:互聯網
上載者:User

中文檔案下載的問題,網上的諮詢和答疑已經很多,我原來處理下載的代碼如下:

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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.