파일 업로드 및 다운로드는 실제 프로젝트 개발 프로세스에서 자주 사용해야 하는 기술입니다. 이 기사의 주요 내용은 다음과 같습니다.
1. 파일 업로드 크기 제한 해결 방법
2. 서버에 파일로 저장
3. 바이너리 바이트 스트림으로 변환하고 데이터베이스에 저장하고 다운로드 방법
4. 인터넷에 리소스 업로드
1부:
먼저 ASP.NET의 파일 업로드 크기 제한 문제를 해결하는 방법에 대해 이야기하겠습니다. 기본적으로 ASP.NET의 파일 업로드 크기 제한은 2M입니다. 일반적으로 웹을 변경하여 사용자 정의할 수 있습니다. 구성 파일의 최대 파일 크기는 다음과 같습니다.
<httpRuntime ExecutionTimeout="300" maxRequestLength="40960" useFullyQualifiedRedirectUrl="false"/>이렇게 하면 업로드되는 파일의 최대값은 4M이 되지만 ASP. NET에서는 모든 파일이 메모리에 로드된 후 처리됩니다. 해결책은 암시적 HttpWorkerRequest를 사용하고 GetPreloadedEntityBody 및 ReadEntityBody 메서드를 사용하여 ASP.NET용 IIS에서 생성된 파이프에서 데이터를 청크로 읽는 것입니다. 구현 방법은 다음과 같습니다.
IServiceProviderprovider=(IServiceProvider)HttpContext.Current;
HttpWorkerRequestwr=(HttpWorkerRequest)provider.GetService(typeof(HttpWorkerRequest));
byte[]bs=wr.GetPreloadedEntityBody();
.
if(!wr.IsEntireEntityBodyIsPreloaded())
{
int=1024;
바이트[]bs2=새바이트[n];
동안(wr.ReadEntityBody(bs2,n)>0)
{
..
}
}이렇게 하면 대용량 파일 업로드 문제가 해결됩니다.
2부:
다음으로 클라이언트에서 파일 형태로 서버에 파일을 업로드하고 업로드된 파일에 대한 기본 정보를 반환하는 방법을 소개합니다. 먼저 업로드된 파일에 대한 정보를 저장하는 클래스를 정의합니다(반환 시 필요). .
공개 클래스 FileUpLoad
{
공개 파일업로드()
{
}
/**//// <요약>
/// 파일명 업로드
/// </summary>
공개 문자열 파일 이름
{
얻다
{
파일명 반환;
}
세트
{
파일명 = 값;
}
}
개인 문자열 파일명;
/**//// <요약>
/// 파일 경로 업로드
/// </summary>
공개 문자열 FilePath
{
얻다
{
파일 경로 반환;
}
세트
{
파일 경로 = 값;
}
}
개인 문자열 파일 경로;
/**//// <요약>
/// 파일 확장자
/// </summary>
공개 문자열 FileExtension
{
얻다
{
파일 확장 반환;
}
세트
{
파일 확장자 = 값;
}
}
개인 문자열 fileExtension;
}
또한 구성 파일(App.Config)에서 업로드된 파일의 형식을 제한할 수도 있습니다.
<?xml version="1.0" 인코딩="gb2312" ?>
<적용>
<파일업로드>
<형식>.jpg|.gif|.png|.bmp</형식>
</FileUpLoad>
</어플리케이션>
이러한 방식으로 다음과 같이 파일 업로드 방법 작성을 시작할 수 있습니다.
공개 FileUpLoad UpLoadFile(HtmlInputFile 입력 파일, 문자열 파일 경로, 문자열 myfileName, bool isRandom)
{
FileUpLoad fp = new FileUpLoad();
string fileName,fileExtension;
문자열 저장이름;
//
//업로드 객체 생성
//
HttpPostedFile 게시파일 = InputFile.PostedFile;
fileName = System.IO.Path.GetFileName(postedFile.FileName);
fileExtension = System.IO.Path.GetExtension(파일 이름);
//
//유형에 따라 파일 형식 결정
//
AppConfig 앱 = 새로운 AppConfig();
string format = app.GetPath("FileUpLoad/Format");
//
//형식이 맞지 않으면 반환
//
if(format.IndexOf(fileExtension)==-1)
{
throw new ApplicationException("업로드된 데이터 형식이 잘못되었습니다.");
}
//
//날짜와 임의의 숫자를 기반으로 임의의 파일 이름을 생성합니다.
//
if(myfileName != 문자열.비어 있음)
{
파일명 = 내파일명;
}
if(isRandom)
{
Random objRand = new Random();
System.DateTime 날짜 = DateTime.Now;
//임의의 파일 이름 생성
saveName = date.Year.ToString() + date.Month.ToString() + date.Day.ToString() + date.Hour.ToString() + date.Minute.ToString()
+ date.Second.ToString() + Convert.ToString(objRand.Next(99)*97 + 100);
파일 이름 = 저장 이름 + 파일 확장;
}
문자열 phyPath = HttpContext.Current.Request.MapPath(filePath);
//경로가 존재하는지 확인하고 존재하지 않으면 경로를 생성합니다.
DirectoryInfo upDir = 새 DirectoryInfo(phyPath);
if(!upDir.Exists)
{
upDir.Create();
}
//
//파일 저장
//
노력하다
{
게시된File.SaveAs(phyPath + fileName);
fp.FilePath = filePath + fileName;
fp.FileExtension = 파일 확장;
fp.파일이름 = 파일이름;
}
잡다
{
throw new ApplicationException("업로드 실패!");
}
//업로드된 파일의 정보를 반환한다.
fp를 반환;
}
그런 다음 파일을 업로드할 때 이 메서드를 호출하고 반환된 파일 정보를 데이터베이스에 저장할 수 있습니다. 다운로드의 경우 경로를 직접 열면 됩니다.
3부:
여기서는 주로 바이너리 형식으로 파일을 업로드하고 다운로드하는 방법에 대해 설명합니다. 먼저 업로드 방법에 대해 설명하겠습니다.
공개 바이트[] UpLoadFile(HtmlInputFile f_IFile)
{
//클라이언트가 지정한 업로드 파일에 접근
HttpPostedFile upFile=f_IFile.PostedFile;
//업로드된 파일의 길이를 가져옵니다.
int upFileLength=upFile.ContentLength;
//업로드된 파일의 클라이언트 MIME 유형을 가져옵니다.
문자열 contentType = upFile.ContentType;
byte[] FileArray=새 Byte[upFileLength];
스트림 fileStream=upFile.InputStream;
fileStream.Read(FileArray,0,upFileLength);
}이 메소드는 업로드된 파일의 바이너리 바이트 스트림을 반환하므로 이를 데이터베이스에 저장할 수 있습니다. 이러한 다운로드 형식에 대해 이야기해 보겠습니다. 이러한 방식으로 다운로드하는 것은 새로운 aspx 페이지를 만든 다음 Page_Load() 이벤트에서 바이너리 바이트 스트림을 꺼내서 읽는 것이라고 생각할 수 있습니다. 권장하지 않습니다. 실제 적용시 특정 사이트를 열 수 없는 오류가 발생할 수 있습니다. 저는 일반적으로 다음과 같은 방법을 사용합니다.
먼저 Web.config에 다음을 추가합니다.
<add verb="*" path="openfile.aspx" type="RuixinOA.Web.BaseClass.OpenFile, RuixinOA.Web"/>
이는 openfile.aspx 페이지를 열 때 시스템이 자동으로 RuixinOA.Web.BaseClass.OpenFile 클래스의 메소드를 실행한다는 것을 의미합니다. 구체적인 구현은 다음과 같습니다.
시스템 사용;
System.Data 사용;
System.Web 사용;
System.IO 사용;
Ruixin.WorkFlowDB 사용;
RXSuite.Base를 사용하여;
RXSuite.Component를 사용하여;
RuixinOA.BusinessFacade
네임스페이스 RuixinOA.Web.BaseClass
사용
{
/**//// <요약>
/// NetUFile에 대한 요약 설명입니다.
/// </summary>
공개 클래스 OpenFile : IHttpHandler
{
공개 무효 ProcessRequest(HttpContext 컨텍스트)
{
//다운로드할 파일 정보를 데이터베이스에서 가져옵니다.
RuixinOA.BusinessFacade.RX_OA_FileManager os = new RX_OA_FileManager();
EntityData 데이터 = os.GetFileDetail(id);
if(data != null && data.Tables["RX_OA_File"].Rows.Count > 0)
{
DataRow dr = (DataRow)data.Tables["RX_OA_File"].Rows[0];
context.Response.Buffer = true;
context.Response.Clear();
context.Response.ContentType = dr["CContentType"].ToString();
context.Response.AddHeader("Content-Disposition","attachment;filename=" + HttpUtility.UrlEncode(dr["CTitle"].ToString()));
context.Response.BinaryWrite((Byte[])dr["CContent"]);
context.Response.Flush();
context.Response.End();
}
}
공개 bool IsReusable
{
get { true를 반환함;}
}
}
}
위의 방법을 실행한 후 시스템은 사용자에게 직접 열거나 다운로드할지 선택하라는 메시지를 표시합니다. 이것이 바로 이 부분입니다.
4부:
이 부분에서는 주로 인터넷에 있는 리소스를 서버에 업로드하는 방법에 대해 설명합니다. 사용 방법을 자세히 설명한 이전 기사가 있으므로 여기서는 더 이상 설명하지 않겠습니다.
참조: 동적 페이지를 이진 바이트 스트림으로 변환
5부: 요약
오늘은 실제 프로젝트 개발에서 흔히 사용되는 몇 가지 파일 업로드 및 다운로드 방법을 간략히 소개하겠습니다. 제가 잘못 쓴 부분은 정정해 주세요. 감사합니다!