Servlet上傳檔案到指定路徑-Form提交
阿新 • • 發佈:2018-12-15
我們使用開源專案Commons FileUpload最常用ServletFileUpload上傳
專案結構:
pom.xml
這裡就是用到了javax.servlet-api-3.0.1.jar、commons-fileupload-1.3.2.jar、commons-io-2.2.jar
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.citywy</groupId> <artifactId>upload-03</artifactId> <packaging>war</packaging> <version>0.0.1-SNAPSHOT</version> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>3.8.1</version> <scope>test</scope> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>3.0.1</version> <scope>provided</scope> </dependency> <dependency> <groupId>commons-fileupload</groupId> <artifactId>commons-fileupload</artifactId> <version>1.3.2</version> </dependency> </dependencies> <build> <finalName>upload-03</finalName> </build> </project>
web.xml
<?xml version="1.0" encoding="UTF-8"?> <web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"> <display-name>Archetype Created Web Application</display-name> <servlet> <description></description> <display-name>Upload01</display-name> <servlet-name>Upload01</servlet-name> <servlet-class>com.citywy.servlet.Upload01</servlet-class> </servlet> <servlet-mapping> <servlet-name>Upload01</servlet-name> <url-pattern>/upload01</url-pattern> </servlet-mapping> </web-app>
Upload01.java
package com.citywy.servlet; import java.io.File; import java.io.IOException; import java.util.Iterator; import java.util.List; import javax.servlet.ServletContext; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.commons.fileupload.FileItem; import org.apache.commons.fileupload.FileUploadException; import org.apache.commons.fileupload.disk.DiskFileItemFactory; import org.apache.commons.fileupload.servlet.ServletFileUpload; public class Upload01 extends HttpServlet { private static final long serialVersionUID = 1L; public Upload01() { super(); } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doPost(request, response); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding("utf-8"); response.setContentType("text/html;charset=utf-8"); //Check that we have a file upload request 檢查是否有檔案上傳請求 boolean isMultipart=ServletFileUpload.isMultipartContent(request); if(isMultipart){ // Create a factory for disk-based file items 建立DiskFileItemFactory物件,設定緩衝區大小和臨時檔案目錄 DiskFileItemFactory factory=new DiskFileItemFactory(); //System.out.println(System.getProperty("java.io.tmpdir"));//預設臨時資料夾 // Set factory constraints /*factory.setSizeThreshold(yourMaxMemorySize); factory.setRepository(yourTempDirectory);*/ //Create a new file upload handler建立ServletFileUpload物件,並設定上傳檔案的大小限制 ServletFileUpload upload=new ServletFileUpload(factory); upload.setSizeMax(10 * 1024 * 1024);// 以byte為單位 不能超過10M 1024byte // Set overall request size constraint // upload.setSizeMax(yourMaxRequestSize); // Parse the request 呼叫ServletFileUpload.parseRequest方法解析request物件,得到一個儲存了所有上傳內容的List物件 try { List<FileItem> items = upload.parseRequest(request); // Process the uploaded items Iterator<FileItem> iter=items.iterator(); while(iter.hasNext()){ FileItem item=iter.next(); //遍歷list,每迭代一個FileItem物件,呼叫其isFormField方法判斷是否是上傳檔案 if(item.isFormField()==true){// 普通表單元素 String name=item.getFieldName();// name屬性值 String value=item.getString();// name對應的value值 System.out.println("form field:"+name+"--"+value); }else{ String fieldName = item.getFieldName(); String fileName = item.getName();// 檔名稱 String contentType = item.getContentType(); boolean isInMemory = item.isInMemory(); long sizeInBytes = item.getSize(); System.out.println("file upload:"+fieldName+"--"+fileName+"--"+contentType+"--"+isInMemory+"--"+sizeInBytes); } // Process a file upload if(!item.isFormField()){ //1.獲取真實地址,這裡儲存在Tomcat執行的專案upload目錄中,這要在src/main/webapp下新建upload資料夾 /*ServletContext sctx = getServletContext(); String path=sctx.getRealPath("/upload"); String fileName = item.getName(); File uploadedFile=new File(path+"\\"+fileName); item.write(uploadedFile);*/ //2.儲存到指定碟符 String fileName=item.getName(); File uploadedFile=new File("d:/tmp/"+fileName); item.write(uploadedFile); } } } catch (Exception e) { e.printStackTrace(); } } } }
index.jsp
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>My JSP 'upload.jsp' starting page</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
</head>
<body>
<form action="/upload-03/upload01" method="post" enctype="multipart/form-data">
請選擇上傳的圖片或檔案:
<!-- 這個是item.isFormField()==false -->
<input type="file" name="fileName"/>
<!-- 這個走的就是item.isFormField()==true -->
<input type="text" name="hello" value="taray">
<input type="submit" value="上傳"/>
</form>
</body>
</html>