asp.Netファイルダウンロードを実現するコード

7887 ワード

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

以上、4つ目はお勧めしない以外は大丈夫ですが、個人的にはブロックでダウンロードしたほうがいいと思います.よくテストしていないので、問題があるかもしれません.
注意:中国語のファイル名を正しく表示するには、符号化する必要があります.長い中国語ファイル名(UTF 8符号化後153バイト以上の中国語)を符号化しても問題がある場合は、以下の記事を参考にしてください.
中国語のファイルのダウンロードの問題について、ネット上のコンサルティングと質疑応答はすでに多くて、私はもとはダウンロードのコードを処理して以下の通りです:
response.setHeader("Content-Disposition", "attachment; filename="+ java.net.URLEncoder.encode(fileName, "UTF-8"));
ダウンロードするプログラムの中でこの文があって、普通はIE 6のダウンロードのヒントの枠の上で正しくファイルの名前を表示して、簡体字の中国語に関わらず、それとも日本語.しかし、当時は確かにファイル名の長い中国語のファイル名をよくテストしていませんでした.まず今よくテストしてみると、文字は17文字を超えるとダウンロードできないことがわかりました.Googleと繰り返しテストを経て、やっとこの問題に対して系統的な認識があり、以下のように列挙された.
一.私の元の方式を通じて、つまり先にURLEncoderで符号化して、中国語の文字が17を超える時、IE 6はファイルをダウンロードすることができません.これはIEのバグです.マイクロソフトのKnowledge Base記事KB 816868を参照してください.なぜならieがResponse Headerを処理する際にheaderの長さを150バイト程度に制限しているからかもしれない.一方、1つの漢字がUTF-8に9バイト符号化されると、17文字が153バイトになるので、エラーが発生します.マイクロソフトは、ここからダウンロードできるパッチを提供しています.このパッチはie 6 sp 1を先にインストールする必要があります.私は普段パッチをよく打っているので、私のIE 6バージョン番号は6.0.2800.1106です.xpsp2_xxxxx.パッチをインストールしてダウンロードできるようになったかもしれませんが、ファイル名が切断されている現象が発生しています.マイクロソフトはIEの次のサービスパックのリリースを待っています.私は今日もインターネットで良いニュースを見て、firefoxの圧力に迫られて、IE 7は年中に発表するかもしれません.また、Firefoxではこのような方式はサポートされておらず、符号化された%x%xxをそのままファイル名として表示する.
二.javamailのMimeUtilityを使ってみました.encode()メソッドは、ファイル名、すなわち=に符号化します.gb2312?B?xxxxxxxx?= このような形式は、RFC 1522から対応する標準サポートを見つける.しかし、残念ながら、IE 6はこの基準をサポートしていません.試してみましたが、Firefoxはサポートされています.
三.ネット上の多くの人が提供しているソリューションによると、ファイル名をISO 8859-1に符号化することは有効なソリューションのようで、コードは以下の通りです.
response.setHeader( "Content-Disposition", "attachment;filename="+ new String( fileName.getBytes("gb2312"), "ISO8859-1") );
添付ファイル名が簡体字中文字であることを確認する場合、この方法は確かに最も有効であり、お客様にIEを個別にアップグレードさせる必要はありません.台湾同胞が使うなら、gb 2312をbig 5に変えればいい.しかし、現在のシステムは通常、国際化のサポートを加えており、UTF-8が一般的に使用されています.ファイル名に簡体字中文字があれば、繁体字中国語もあれば、日本語もあります.では、文字化けして発生します.また、私のパソコンでFirefox(v 1.0-en)ダウンロードも文字化けしています.
折衷的に考えて、私は1、3の方法を結合して、コードの断片は以下の通りです.
 
  
String fileName = URLEncoder.encode(atta.getFileName(), "UTF-8");
/*
* see http://support.microsoft.com/default.aspx?kbid=816868
*/
if (fileName.length() > 150) {
String guessCharset = xxxx /* request locale , gb2312*/
fileName = new String(atta.getFileName().getBytes(guessCharset), "ISO8859-1");
}
response.setHeader("Content-Disposition", "attachment; filename=" + fileName);

Firefoxは、IEの企業ユーザー市場にまだ強力に侵入していないようだからだ.お客様の購入に影響を与えるのは、互換性ではなく進捗状況です.