asp.net(c#) 파일에 대한 질문
파일 경로가 중국어인가요? zh-tw 이것은 중국어 번체입니다!
asp.net2.0 이후에는 파일 다운로드에 대한 다양한 옵션이 있습니다.
public 부분 클래스 FileDownLoad: System.Web.UI.Page
{
//다운로드한 파일을 제공하지 않으면 파일 이름이 깨집니다.
p>
private string fileName = HttpContext.Current.Server.UrlEncode("Specification.rar")
private string filePath = HttpContext.Current.Server.MapPath( "Specification.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)
//Flush를 사용하는 경우 Content-Length를 지정하지 않으면 다운로드가 표시되지 않습니다.
Response.AddHeader("Content-Length", fileSize.ToString())
Response.TransmitFile(filePath , 0, fileSize);
Response.Flush();
Response.Close()
}
//사용 파일을 다운로드하기 위한 WriteFile
protected void btnDL2_Click(객체 전송자, EventArgs e)
{
FileInfo info = new FileInfo(filePath)
long fileSize = info.Length;
Response.Clear();
Response.ContentType = "application/octet-stream"; AddHeader("콘텐츠 처리", "파일 첨부
nt;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 스트림 = null
try
{ p>
//파일 열기
stream = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.Read)
dataToRead = stream. /p>
//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 - 길이
}
else
{
//클라이언트 연결 끊김 방지
dataToRead = -1
}
}
}
catch (예외 예)
{
Response.Write("Error:" + ex.Message)
}
마지막으로
{
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. 열기, 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)
응답. AddHeader("Content-Length", bytes.Length.ToString())
Response.BinaryWrite(bytes)
Response.Flush(); > }
catch (예외 예)
{
Response.Write("Error:" + ex.Message); }
마지막으로
{
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 스트림 = null
long dataToRead = 0;
p>
시도
{
stream = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare
.Read);
dataToRead = stream.Length;
//Http 헤더 추가
Response.ContentType = "application/octet-stream"; p>
p>
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(); /p>
Response.Clear();
dataToRead -= 길이
}
else
{ p>
dataToRead = -1;
}
}
}
catch(예외 예시)
{
Response.Write("오류:" + ex.Message)
}
마지막으로
{
if (stream != null)
{
stream.Close()
}
응답 .닫다();
}
}
}
공개 부분 클래스 FileDownLoad: System.Web.UI.Page { //다운로드한 파일 제공 , 인코딩되지 않으면 파일 이름이 왜곡됩니다. private string fileName = HttpContext.Current.Server.UrlEncode("standard.rar") private string filePath = HttpContext.Current.Server.MapPath("standard.rar"); TransmifFile 다운로드 파일 보호 void btnDL1_Click(object sender, EventArgs e) { FileInfo info = new FileInfo(filePath); long fileSize = info.Length; Response.ContentType = "application/x-zip-compressed" ; Response .AddHeader("Content-Disposition", "attachment;filename="+ fileName); //Content-Length를 지정하지 않고 Flush를 사용하면 다운로드 진행 상황이 표시되지 않습니다. , fileSize.ToString()) ; Response.TransmitFile(filePath, 0, fileSize); Response.Flush(); Response.Close() } //WriteFile을 사용하여 보호된 파일 다운로드 void btnDL2_Click(object sender, EventArgs e) FileInfo info = new FileInfo(filePath) ; long fileSize = info.Length; Response.ContentType = "application/octet-stream"; Response.AddHeader("Content-Disposition", "attachement;filename=" + fileName); //파일 크기 지정 Response.AddHeader("Content-Length", fileSize.ToString()) Response.WriteFile(filePath, 0, fileSize); } //OutputStream.Write를 사용하여 청크 다운로드 파일 protected void btnDL3_Click(object sender, EventArgs e) { //청크 크기 지정 longchunkSize = 102400 //100K 버퍼 생성 byte[] buffer = new byte[chunkSize]; //읽은 바이트 수 long dataToRead = 0 FileStream stream = null try { //파일 열기 스트림 = new FileStream(filePath, FileMode.Ope;
n, 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.Clear(); dataToRead -= length } else { //클라이언트 연결 끊김 방지 } } } catch (예외 ex) { Response.Write("Error:" + ex.Message); } finally { if (stream != null) { stream.Close() } Response.Close(); BinaryWrite를 사용하여 파일을 다운로드하면 비효율적으로 보호됩니다. 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); //Http 추가 header Response.ContentType = "application/octet-stream"; Response.AddHeader("Content-Disposition", "attachement;filename=" + fileName); Response.AddHeader("Content-Length", bytes.Length.ToString() ); Response.BinaryWrite (바이트); Response.Flush(); } catch (예외 ex) { Response.Write("Error:" + ex.Message) } finally { if (stream != null) (); } Response .Close(); } } //BinaryWrite를 사용하여 보호된 청크로 파일을 다운로드합니다. void btnDL5_Click(object sender, EventArgs e) { //청크 및 버퍼를 지정합니다. ChunkSize = 102400;
byte[] 버퍼 = 새로운 byte[chunkSize]; FileStream 스트림 = null; long dataToRead = 0; try { stream = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.Read) / /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); .Clear(); dataToRead -= 길이; } else { dataToRead = -1; } } } catch(Exception ex) { Response.Write("Error:" + ex.Message) } finally { if (stream != null ) { stream.Close(); } Response.Close(); } } }
권장되지 않는 네 번째 옵션을 제외하고 다른 모든 옵션은 허용되지만 개인적으로 덩어리로 다운로드하는 것이 좋다고 생각합니다. 더 나은. 주의 깊게 테스트되지 않았으므로 뭔가 문제가 있을 수 있습니다.
참고: 올바르게 표시하려면 중국어 파일 이름을 인코딩해야 합니다. 긴 중국어 파일 이름(UTF8 인코딩 후 153바이트를 초과하는 중국어)의 경우 인코딩하더라도 여전히 문제가 있습니다. 이 링크를 참조하세요.
/river_5566/blog/item/d66804cef8afb031b700c863.html