파일을 업로드하는 방법
파일 업로드 기능을 달성하기 위해 두 단계로 웹 개발 :
- 웹에서 항목을 추가 페이지를 업로드
- 서블릿에서 데이터를 업로드 된 파일을 읽고 로컬 하드 드라이브에 저장
대부분의 파일을 통해 업로드되어 있기 때문에 폼 형태로 서버에 제출, 그래서 당신은 파일을 업로드 페이지를 제출하기위한 양식을 작성해야합니다.
다음과 같은 형식의 파일 업로드 페이지를 구성 할 수 있습니다 :
- 할 우선 만들 파일을 업로드 할 수있는 페이지를 제출하기위한 양식을
- 페이지에서는 사용할 필요가 <입력 유형 = "파일"> 웹 페이지에서 파일 업로드 항목을 추가 태그를
- 당신은 설정해야 입력 의 항목 이름 , 그렇지 않으면 브라우저가 데이터 업로드 파일을 전송하지 않습니다, 속성을
- 폼 페이지이어야 방법 속성이 설정되어 배치 예를 에 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 브라우저를 사용