웹에 업로드 및 다운로드 파일

웹 응용 프로그램의 업로드 및 다운로드 파일은 매우 일반적이고 매우 유용한 기능입니다.

예를 들어 전자 메일을 전송하는 것은 동일한 업로드 파일 첨부를 통해 전송 될 때, OA 시스템은 더 파일, 업로드 사진에 의해 사용자 정의 아바타에서 소셜 네트워킹 사이트를 업로드하여 문서를 제출할 수 있습니다.

업로드하고 말할 수있는 다운로드 각 웹 응용 프로그램의 요구 기능을 가지고 있다는 것입니다.

우리가 파일 업로드에 대해 얘기하자 (1)

단계 1.1 파일 업로드

업로드 파일은 두 단계로 나누어 져 있습니다 :

  1. 사용자가 선택한 파일이 페이지에 업로드하고, 서블릿에 요청을 제출한다.
  2. 서블릿은 파일을 업로드 한 다음 서버에 파일을 저장하기 위해 사용자 구문 분석 요청을받습니다.
      
1.2 업로드 할 파일을 생성

(1) 형태의 폼을 만들

<form action="" method="post" enctype="multipart/form-data">
	<input type="file" name="file" /><br /><br />
	<input type="submit" value="上传" />
</form>

파일 업로드 양식과 이전의 형태로, 그러나 다음과 같은 유의해야한다 :

  • 양식 방법 속성은 게시해야
  • 양식에 enctype 속성 여러 부분합니다 / 폼 데이터를
  • 파일 업로드 제어, 파일 유형 속성 INTPUT입니다

형태는 효과 다음 열립니다 후 :

  • IE
    [그림 체인이 실패 덤프 외부 소스 스테이션은 보안 체인 메커니즘을 가질 수있다, 그것은 바로 아래 업로드 한 사진을 저장하는 것이 좋습니다 (IMG-mBpow80B-1575204296109) (실리콘 밸리 _ 아직 업로드 및 다운로드 파일 .assets 장 Chunsheng _ / 1558975331009.png)]

  • 크롬
    [그림 체인이 실패 덤프 외부 소스 스테이션은 보안 체인 메커니즘을 가질 수있다, 그것은 바로 아래 업로드 한 사진을 저장하는 것이 좋습니다 (IMG-IinJkTnD-1575204296111) (실리콘 밸리 _ 아직 업로드 및 다운로드 파일 .assets 장 Chunsheng _ / 1558975309963.png)]

  • 파이어 폭스
    [그림 체인이 실패 덤프 외부 소스 스테이션은 보안 체인 메커니즘을 가질 수있다, 그것은 바로 아래 업로드 한 사진을 저장하는 것이 좋습니다 (IMG-Fqe1N8ok-1575204296111) (실리콘 밸리 _ 아직 업로드 및 다운로드 파일 .assets 장 Chunsheng _ / 1558975370024.png)]

(2) 쓰기 Servelet는
  페이지 양식 컨트롤을 만든 후, 파일을 다루는 지정된 서블릿에 요청을 제출 업로드 버튼을 클릭하여 선택합니다.
참고 :
  이 더 이상 서블릿을하기 전에 그대로 다음에 enctype = "multipart / form-data"로, 그리고 getParamter를 사용할 때, request.getParamter (인수 요청 매개 변수), () 인수 내용이 항상 비어있다. 브라우저는 이미 방법을 변경하는 요청을 전송하기 때문에. 그래서 새로운 도구 평민 - 파일 업로드를 소개합니다.

  

1.3 평민 - 파일 업로드
  • 가공 - 파일 업로드 아파치 역할은 파라미터 흐름 요청 개체에서 해석되어야하며, 사용자에 의해 전송 업로드 요청 공구 업로드 프로세스 특별히 개발되었다.
  • 공유지 - 파일 업로드 패키지 평민-IO를 따라 두 개의 패킷을 가져와야합니다.

코어 클래스 :
(1) DiskFileItemFactory

  1. ServletFileUpload, 세트 캐싱을 만들기위한 공장 클래스

  2. 이 클래스는 일반적으로 인스턴스를 생성하는 생성자로 사용

  3. 방법 :

    공공 무효 setSizeThreshold (INT sizeThreshold) : 캐시 파일의 크기를 설정하는 데 사용 (기본 10킬로바이트)

    공공 무효 setRepository (파일 저장소) : 캐시 파일 위치 (기본 시스템의 캐시 디렉토리)를 설정하는 데 사용

(2) ServletFileUpload

  1. 이 클래스는, 그래서 (일반 매개 변수 및 매개 변수 파일 포함) 사용자 요청의 취득 전송 매개 변수로 요청 객체를 해결하는 데 사용됩니다

  2. 이 클래스는 매개 변수를 생성자는 인스턴스를 생성 호출 할 필요가있다, 생성자는 DiskFileItemFactory과 같은 매개 변수가 필요합니다

  3. 방법 :

    공개 목록 parseRequest (HttpServletRequest의 요청) : 요청 개체 매개 변수 취득 요구를 분석, 목록을 반환 목록은 FileItem에 저장되는 객체, 요청 매개 변수를 나타내는 객체입니다.

    공공 무효 setFileSizeMax (긴 fileSizeMax가) : B의 ​​단위로, 하나의 파일의 크기 제한을 설정 업로드 된 파일이 범위를 벗어나는 경우 것 () parseRequest에서 예외 FileSizeLimitExceededException을 던진다.

    공공 무효 setSizeMax (긴 sizeMax) 요청 된 컨텐츠의 전체 크기를 제한 B. 단위 업로드 된 파일이 범위를 벗어나는 경우 것 () parseRequest에서 예외 SizeLimitExceededException을 던진다.

(3) FileItem

  1. 사용자가 전송 패키지에 대한 이러한 매개 변수와 파일, 정보가 사용자에게 전송됩니다로 패키지됩니다 FileItem 우리가 객체를 통해 정보를 요청 매개 변수 또는 업로드 파일을 가져, 객체.

  2. 우리는 수동으로 클래스를 만들 필요가 없습니다, 파싱은 ServletFileItem 리턴을 요청합니다.

  3. 방법 :

    문자열 GetFieldName을는 () 중에서 입력의 name 속성의 값은 각각의 테이블 명을 취득.
    문자열 getName은 () : 업로드 된 파일의 이름을 가져옵니다 공통 요청 매개 변수가 null입니다.

    문자열에는 getString (문자열 인코딩) : 콘텐츠에 대한 액세스는 매개 변수를 인코딩하는 것은 문자 집합을 지정합니다.

    이 파일 인 경우 ①, 파일 스트림은 문자열로 변환됩니다.

    ② 요청 파라미터 경우, 요청 파라미터를 인수 값.

    부울 isFormField는 () : 현재 패키지 공통 FileItem 요청 파라미터 또는 파일인지의 여부를 판정한다.

    ① 정상 동작 매개 변수에 반환 : 사실

    ② 파일 매개 변수가 반환되는 경우 : 거짓

    문자열 getContentType는 () : 업로드 된 파일의 MIME 형식을 가져옵니다

    긴의 getSize는 () : 내용의 크기를 가져옵니다

샘플 코드 :

//创建工厂类
DiskFileItemFactory factory = new DiskFileItemFactory();
//创建请求解析器
ServletFileUpload fileUpload = new ServletFileUpload(factory);
//设置上传单个文件的的大小
fileUpload.setFileSizeMax(1024*1024*3);
//设置上传总文件的大小
fileUpload.setSizeMax(1024*1024*3*10);
//设置响应内容的编码
response.setContentType("text/html;charset=utf-8");
try {
	//解析请求信息,获取FileItem的集合
	List<FileItem> items = fileUpload.parseRequest(request);
	//遍历集合
	for (FileItem fileItem : items) {
		//如果是普通的表单项
		if(fileItem.isFormField()){
		    //获取参数名
		    String fieldName = fileItem.getFieldName();
		    //获取参数值
		    String value = fileItem.getString("utf-8");
		    System.out.println(fieldName+" = "+value);
	        //如果是文件表单项
	    }else{
		    //获取文件名
		    String fileName = fileItem.getName();
		    //获取上传路径
		    String realPath = getServletContext().getRealPath("/WEB-INF/upload");
		    //检查upload文件夹是否存在,如果不存在则创建
		    File f = new File(realPath);
		    if(!f.exists()){
			    f.mkdir();
		    };
		    //为避免重名生成一个uuid作为文件名的前缀
		    String prefix = UUID.randomUUID().toString().replace("-", "");
		    //将文件写入到服务器中
		    fileItem.write(new File(realPath+"/"+prefix+"_"+fileName));
		    //清楚文件缓存
		    fileItem.delete();
	    }
}
} catch (Exception e) {
	if(e instanceof SizeLimitExceededException){
		//文件总大小超出限制
		response.getWriter().print("上传文件的总大小不能超过30M");
	}else if(e instanceof FileSizeLimitExceededException){
		//单个文件大小超出限制
		response.getWriter().print("上传单个文件的大小不能超过3M");
	}
} 
response.getWriter().print("上传成功");

  

파일을 다운로드합니다

사용 2.1 지침

  가장 직접적인 방법은 디렉토리 서버에 직접 파일을 넣어하는 것입니다 다운로드, 파일을 직접 액세스 할 수있는 사용자가 직접 다운로드.

  그러나 사실이 방법은 파이어 폭스와 경우 예를 들어, 우리는 직접 서버에 MP3 파일을 저장 한 다음이 나타납니다 다운로드 창으로 가능한 경우, 브라우저를 통해 IE 브라우저 파일의 주소를 액세스하고, 사용하기 쉬운 필요는 없다 크롬은 직접 플레이에 가능성이있다. 우리는 우리가 서블릿을 통해 다운로드 기능을 완료 할 필요가 있습니다 직접 액세스에 대한 사용자를 원하지 않는 일부 문서도 있습니다.

: 키 파일 포인트 다운로드하는 것입니다
브라우저에 파일을 전송 스트림의 형태 (1) 서버를.
(2)를 동시에 전송은 또한 정보를 다운로드 브라우저에게 어떤 응답 헤더를 설정해야 스트림.
특정 응답 헤더는 그대로 다음 :
내용 - 형식 :

  • 다운로드 파일의 MIME 타입
  • 의 servletContext 얻을 수 있습니다. GetMimeType (문자열 파일)
  • 직접 수동으로 지정 또한 할 수있다
  • 使用 response.setContentType (문자열 형);
  • 응답 헤더 스타일 : 내용 - 형식 : 오디오 / MPEG

내용 - 처리 :

  • 다운로드 한 파일의 이름은, 주요 역할은 기본 사용자 이름을 제공하는 것입니다
  • response.setHeader ( "내용 - 처리", 처분)을 설정하여
  • 응답 헤더 스타일 : 내용 - 처리 : 첨부 파일, 파일 이름 = xxx.mp3

콘텐츠 길이 :

  • 다운로드 한 파일의 길이 (필요하지) 세트의 강점에 대한 파일
  • . 응답하여로 setContentLength (INT LEN) 세트.
  • 스타일을 설정 한 후 : 콘텐츠 길이 : 3140995

(3) 다음에, 입력 스트림의 형태로 하드 디스크에 파일을 판독 할 필요

  • FileInputStream에는 = 새로운 FileInputStream에 (파일)입니다;
  • 흐름은 우리가 콘텐츠 브라우저로 전송됩니다 것입니다

(4) 스트림을 통해 브라우저로 응답 파일 (입력 스트림)에 대한 출력 스트림을 취득

  • 출력 스트림을 획득 : 메소드가 ServletOutputStream를 response.getOutputStream = 아웃 ();

  • 출력 파일을 전송하기 위해 브라우저를 통해 흘러 (입력 스트림을 닫습니다 잊지 마세요)

    byte[] b = new byte[1024];
    int len = 0;
    while((len=is.read(b))> 0){
    	out.write(b, 0, len);
    }
    is.close();
    
    

  

입증하는 단계 2.2

  • 어떤 단계를 같은 서블릿의 doGet 메소드로 작성 () 메소드
  • 나는 mp3 파일은 WEB-INF에있는 파일 폴더에 저장됩니다 다운로드

특정 단계 :
(1) 파일의 취득 스트림 :

 String realPath = getServletContext().getRealPath("/WEB-INF/mp3/中国话.mp3");
 //获取文件的File对象
 File file = new File(realPath);
 //获取文件的输入流
 FileInputStream is = new FileInputStream(file);
 

(2)는 헤더 정보를 획득 :

  //获取文件的MIME信息
  String contentType = getServletContext().getMimeType(realPath);
  //设置下载文件的名字
  String filename = "zhongguohua.mp3";
  //创建Content-Disposition信息
  String disposition = "attachment; filename="+ filename ;
  //获取文件长度
  long size = file.length();
  

(3) 설정 정보 헤더

//设置Content-Type
response.setContentType(contentType);
//设置Content-Disposition
response.setHeader("Content-Disposition", disposition);
//设置文件长度
response.setContentLength((int)size);

(4) 파일 보내기

 //通过response获取输出流,用于向浏览器输出内容
 ServletOutputStream out = response.getOutputStream();
 //将文件输入流通过输出流输出
 byte[] b = new byte[1024];
 int len = 0;
 while((len=is.read(b))> 0){
 	out.write(b, 0, len);
 }
 //最后不要忘记关闭输入流,输出流由Tomcat自己处理,我们不用手动关闭
 is.close();
 

  

2.3 왜곡

  지금까지 실제로 다운로드 한 파일의 주요 기능은 완료되었습니다. 이제 우리는 파일 이름 일반 영어, 아니 쓰레기 문제를 사용하고 있기 때문에, 그것은 반영되지 않은 우리가 여기에 문제가있는 것입니다. 우리는 파일의 중국 이름을 사용하려는 경우 여기에, 그것은 의심의 여지가 깨진하지 나타납니다.

이 문제에 대한 해결책은 인수 후 파일 이름에 파일 이름을 인코딩하는, 간단하다 :

filename = java.net.URLEncoder.encode(filename,"utf-8");

그는 BASE64 당신이 파이어 폭스에서이 문제를 고려할 필요가 그렇다면, 기본적으로 디코딩하기 때문에 파이어 폭스 브라우저가 아니라 특수가, 다음, 그것은 또한 특별한 치료를 필요로합니다.

(1) (요청을 취득하여 사용자 에이전트 헤더 정보)를 클라이언트 정보를 얻기 위해 제

//获取客户端信息
String ua = request.getHeader("User-Agent");

(2) 다음 (문자열 파이어 폭스가 포함되어 있는지 여부를 판단하여 브라우저 헤더 정보의 버전을 확인하기 위해) 다른 처리 브라우저 버전, 결정

//判断客户端是否为火狐
if(ua.contains("Firefox")){
	//若为火狐使用BASE64编码
	filename = "=?utf-8?B?"+new BASE64Encoder()
.encode(filename.getBytes("utf-8"))+"?=";
}else{
	//否则使用UTF-8
	filename = URLEncoder.encode(filename,"utf-8");
}

(3)은 문자열 인코딩 방식을 선택하도록 구성.

String string = new String("你好.jpg".getBytes("gbk"), "iso8859-1");
게시 된 166 개 원래 기사 · 원 찬양 585 ·은 60000 +를 볼

추천

출처blog.csdn.net/zxdspaopao/article/details/103339226