업로드 및 자바 웹 개발에서 파일을 다운로드

면책 조항 :이 문서는 블로거 원본입니다, 추적 에 의해-SA의 CC 4.0 저작권 계약, 복제, 원본 소스 링크이 문을 첨부 해주세요.
이 링크 : https://blog.csdn.net/suoyue_py/article/details/98759490

파일을 업로드하는 방법

파일 업로드 기능을 달성하기 위해 두 단계로 웹 개발 :

  • 웹에서 항목을 추가 페이지를 업로드
  • 서블릿에서 데이터를 업로드 된 파일을 읽고 로컬 하드 드라이브에 저장

대부분의 파일을 통해 업로드되어 있기 때문에 형태로 서버에 제출, 그래서 당신은 파일을 업로드 페이지를 제출하기위한 양식을 작성해야합니다.
다음과 같은 형식의 파일 업로드 페이지를 구성 할 수 있습니다 :

  1. 할 우선 만들 파일을 업로드 할 수있는 페이지를 제출하기위한 양식을
  2. 페이지에서는 사용할 필요가 <입력 유형 = "파일"> 웹 페이지에서 파일 업로드 항목을 추가 태그를
  3. 당신은 설정해야 입력 의 항목 이름 , 그렇지 않으면 브라우저가 데이터 업로드 파일을 전송하지 않습니다, 속성을
  4. 폼 페이지이어야 방법 속성이 설정되어 배치 예를 에 enctype의 속성으로 설정 을 "multipart / form-data" 형.
    샘플 코드 :
    <%--指定表单的enctype属性以及提交方式--%>
    <form enctype="multipart/form-data" method="post">
    	<%--指定标记的类型和文件域的名称--%>
    	选择上传文件:< inpurt type="file" name="myfile"/><br />
    </form>

조직 소스 구성 요소 아파치 제공 커먼즈 - 더는 FileUpload하는 것은 쉽게 할 수있다 "다중 / 폼 데이터" 양식 필드의 해석 요청 다양한 유형 및 하나 개 이상의 파일을 업로드 할뿐만 아니라, 파일 업로드의 크기를 제한 할 수 있습니다 등등. 가져와야 사용 평민 - fileupload.jar평민 - io.jar 이 개 JAR 패키지, Quguan 네트워크 : "http://commons.apache.org/"다운로드 (구성 요소 열 URL 페이지 아파치 코 몬즈에서 테이블 아래 적절한 는 FileUpload 및 IO).

파일을 다운로드하는 방법

타사 구성 요소를 사용하지 않고 달성 다운로드, 직접 서블릿 클래스와 입력 / 출력 스트림 수 있습니다.
그리고 서버 파일에 대한 액세스가 다른, 당신이 달성하고자하는 파일을 다운로드뿐만 아니라 파일의 경로를 지정해야합니다뿐만 아니라 HTTP 프로토콜에 두 개의 응답 헤더를 설정해야합니다 :

//设置接受程序处理方式
Content-Disposition:attachment;filename=
//设定实体内容的MIME类型(多用途互联网邮件扩展类型)
Content-Type:appliccation/x-msdownload

원리 다운로드 한 파일의 구현의 설명 :
첫 번째 파일을 다운로드 주소를 얻고 바이트 파일 입력 스트림을 생성하고 상기 어드레스에 따라 상기 스트림에 의해 다운로드 한 파일의 내용을 판독하고, 최종적으로 대상 파일로 출력 스트림의 내용을 읽을 .

질문의 예 :

디자인의 다음과 같은 요구 사항에 따라 파일에서 UploadServelt 구현 클래스를 업로드하세요?
다음과 같이 요구 사항은
1) 알려진 형태의 문서 form.html 양식 명명 된 파일 이름 텍스트 상자 정의하고 myfile을의 도메인 이름이 필수 파일 업로드가 포함되어 있습니다.
2)의 doPost () 메소드에서 파일 업로드 관련 코드를 작성합니다.
3) 현재 파일 업로드 응용 프로그램의 폴더에 저장된 파일을 업로드 할 수 있습니다.
해결 방법 : 다음과 같이 UploadServelt은 코드입니다 :

public class UploadServlet extends HttpServlet {
	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		response.setContentType("text/html;charset=utf-8");
		try {			// 创建工厂
			DiskFileItemFactory factory = new DiskFileItemFactory();
			factory.setRepository(new File("e:\\Target"));
			ServletFileUpload fileupload = new ServletFileUpload(factory);			// 创建 fileupload 组件
			fileupload.setHeaderEncoding("utf-8");
			List<FileItem> fileitems = fileupload.parseRequest(request);			// 解析 request
			PrintWriter writer = response.getWriter();
			for (FileItem fileitem : fileitems) {			// 遍历集合
				if (fileitem.isFormField()) {				// 判断是否为普通字段
					String name = fileitem.getFieldName();					// 获得字段名和字段值
					String value = fileitem.getString("utf-8");
				} else {					// 上传的文件路径
					String filename = fileitem.getName();
					writer.print("文件来源:" + filename + "<br>");
					filename = filename					// 截取出文件名
							.substring(filename.lastIndexOf("\\") + 1);
					writer.print("成功上传的文件:" + filename + "<br>");
					filename = UUID.randomUUID().toString() + "_" + filename;				// 文件名需要唯一
					String webPath = "/upload/" + filename;					// 在服务器创建同名文件
					String path = getServletContext().getRealPath(webPath);
					File file = new File(path);					// 创建文件
					file.getParentFile().mkdirs();
					file.createNewFile();
					InputStream in = fileitem.getInputStream();					// 获得上传文件流
					OutputStream out = new FileOutputStream(file);			// 获得写入文件流
					byte[] buffer = new byte[1024];					// 流的对拷
					int len;
					while ((len = in.read(buffer)) > 0)
						out.write(buffer, 0, len);
					in.close();					// 关流
					out.close();
					fileitem.delete();					// 删除临时文件
				}
			}
		} catch (Exception e) {
			throw new RuntimeException(e);
		}
	}

	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		doGet(request, response);
	}
}

두 가지 예를 질문 :

표시 할 수없는 중국어 쓰레기 문제를, 파일 다운로드 프로그램을 실행 파일을 다운로드하기 위해 사용되는 파일 이름을 적어주십시오?
해결 방법 :
다음과 같이 구현은 그 함수 단계 :
(1) 다운로드 페이지 download.jsp를 만들

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" 
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>文件下载</title>
</head>
<body>
<a href="${pagContext.request.contextPath}/chapter06/DownloadServlet"}>
		文件下载
	</a>
	<br />
</body>
</html>

주로 파일을 설정하는 데 사용됩니다 DownloadServlet 클래스 (2) 준비 다운로드하고, 파일 브라우저 모드로 열립니다하고 사용 인코딩 (String를, 문자열 ENC) 지정된 형태에있어서, 상기 URL 인코딩 된 문자열을 출력, 왜곡 중국어 파일 이름의 출현을 방지하기 위해

import java.io.*;
import java.net.URLEncoder;
import javax.servlet.*;
import javax.servlet.http.*;
public class DownloadServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
         response.setContentType("text/html;charset=utf-8");
          // 获得绝对路径创建文件对象
         String path=getServletContext().getRealPath("/download/人物.jpg");
         File file=new File(path);
          // 通知浏览器以下载的方式打开文件
		response.addHeader("Content-Type", "application/octet-stream");
         response.addHeader("Content-Disposition","attachment;filename="
         +URLEncoder.encode(file.getName(),"utf-8"));
		InputStream in=new FileInputStream(file);         // 通过文件对象获取文件相关的输入流
		OutputStream out = response.getOutputStream();         // 获取response对象的输出流
         byte [] buffer=new byte[1024];
		int len;
		while((len=in.read(buffer))!=-1){
			out.write(buffer,0,len);
		}
	}
	public void doPost(HttpServletRequest req, HttpServletResponse  resp)
			throws ServletException, IOException {
		doGet(req, resp);
	}
}

(3) 저장 파일을 다운로드하려면 download.jsp을 방문하는 파일의 다운로드 링크에서 페이지를 클릭 IE 브라우저를 사용

추천

출처blog.csdn.net/suoyue_py/article/details/98759490