Servlet之文件上传

一、Servlet实现文件上传,需要添加第三方提供的jar包

下载地址:

1) commons-fileupload-1.2.2-bin.zip      :   点击打开链接

2) commons-io-2.3-bin.zip                       :    点击打开链接    


二:文件上传需要注意的问题:

0.文件上传的表单提交方式必须是POST方式,编码类型:enctype="multipart/form-data",默认是 application/x-www-form-urlencoded。比如:<form action="FileUpLoad"enctype="multipart/form-data"method="post">

1.上传文件的中文乱码

1.1 解决文件的乱码
ServletFileUpload.setHeaderEncoding("UTF-8")
1.2 解决普通输入项的乱码(注意,表单类型为multipart/form-data的时候,设置request的编码是无效的)
FileItem.setString("UTF-8");  //解决乱码
2.在处理表单之前,要记得调用:
ServletFileUpload.isMultipartContent方法判断提交表单的类型,如果该方法返回true,则按上传方式处理,否则按照传统方式处理表单即可。
3.设置解析器缓冲区的大小,以及临时文件的删除
设置解析器缓冲区的大小  DiskFileItemFactory.setSizeThreshold(1024*1024);
临时文件的删除:在程序中处理完上传文件后,一定要记得调用item.delete()方法,以删除临时文件
4.在做上传系统时,千万要注意上传文件的保存目录,这个上传文件的保存目录绝对不能让外界直接访问到。
5.限制上传文件的类型
在处理上传文件时,判断上传文件的后缀名是不是允许的
6.限制上传文件的大小
调用解析器的ServletFileUpload.setFileSizeMax(1024*1024*5);就可以限制上传文件的大小,如果上传文件超出限制,则解析器会抛FileUploadBase.FileSizeLimitExceededException异常,程序员通过是否抓到这个异常,进而就可以给用户友好提示。
7.如何判断空的上传输入项
String filename = item.getName().substring(item.getName().lastIndexOf("\\")+1);  //""
if(filename==null || filename.trim().equals("")){
continue;
}
8、为避免上传文件的覆盖,程序在保存上传文件时,要为每一个文件生成一个唯一的文件名
public String generateFileName(String filename){
//83434-83u483-934934
return UUID.randomUUID().toString() + "_" + filename;
}
9、为避免在一个文件夹下面保存超过1000个文件,影响文件访问性能,程序应该把上传文件打散后存储。(也可以按时间)
public String generateSavePath(String path,String filename){
int hashcode = filename.hashCode();  //121221,采用的是哈希值进行打散
int dir1 = hashcode&15;
int dir2 = (hashcode>>4)&0xf;

String savepath = path + File.separator + dir1 + File.separator + dir2;
File file = new File(savepath);
if(!file.exists()){
file.mkdirs();
}
return savepath;
}
10、监听上传进度(进度条)
ServletFileUpload upload = new ServletFileUpload(factory);
upload.setProgressListener(new ProgressListener(){
public void update(long pBytesRead, long pContentLength, int pItems) {
System.out.println("当前已解析:" + pBytesRead);
}
});
11、在web页面中添加动态上传输入项


三、举例

1.fileupload.jsp

  1. <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>  
  2. <%  
  3. String path = request.getContextPath();  
  4. String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";  
  5. %>  
  6.   
  7. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">  
  8. <html>  
  9.     
  10.   <body>  
  11.      <!-- enctype 默认是 application/x-www-form-urlencoded -->  
  12.      <form action="FileUpLoad" enctype="multipart/form-data" method="post" >  
  13.           
  14.                用户名:<input type="text" name="usename"> <br/>  
  15.                上传文件:<input type="file" name="file1"><br/>  
  16.               上传文件: <input type="file" name="file2"><br/>  
  17.               <input type="submit" value="提交"/>  
  18.        
  19.      </form>
  20.   </body>  
  21.   
      <script type="text/javascript">
      function addfile(){
      var files = document.getElementById("files");
     
      var input = document.createElement("input");
      input.type='file';
      input.name='file';
     
      var btn = document.createElement("input");
      btn.type = 'button';
      btn.value = '删除';
      btn.onclick = function del(){
      this.parentNode.parentNode.removeChild(this.parentNode);
      }
     
      var div = document.createElement("div");
      div.appendChild(input);
      div.appendChild(btn);
     
      files.appendChild(div);
      }  
      </script>  
      <body>    
        <form action="/day18/servlet/UploadServlet3" enctype="multipart/form-data" method="post">    
        <table>
        <tr>
        <td>上传用户</td> 
  22. <td><input type="text" name="username"></td>
        </tr>
       
        <tr>
        <td>上传文件</td>
        <td><input type="button" value="添加上传文件" οnclick="addfile()"></td>
        </tr>
       
        <tr>
        <td></td>
        <td><div id="files"></div></td>
        </tr>
       
        <tr>
        <td></td>
        <td> <input type="submit" value="上传"></td>
        </tr>
        
        </table>
        </form>       
      </body>
    </html>

2.实际处理文件上传的 FileUpLoad.java

<span style="font-family:KaiTi_GB2312;font-size:14px;">package cn.itcast.web.servlet;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Arrays;
import java.util.List;
import java.util.UUID;

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.FileUploadBase;
import org.apache.commons.fileupload.ProgressListener;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;

public class UploadServlet3 extends HttpServlet {

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

		List types = Arrays.asList("jpg", "gif", "avi", "txt");

		try {
			DiskFileItemFactory factory = new DiskFileItemFactory(); // 10k
			factory.setSizeThreshold(1024 * 1024);
			factory.setRepository(new File(this.getServletContext()
					.getRealPath("/temp")));

			ServletFileUpload upload = new ServletFileUpload(factory);
			upload.setProgressListener(new ProgressListener() {
				public void update(long pBytesRead, long pContentLength,
						int pItems) {
					System.out.println("当前已解析:" + pBytesRead);
				}
			});

			upload.setFileSizeMax(1024 * 1024 * 5);
			if (!upload.isMultipartContent(request)) {
				// 按照传统方式获取表单数据
				request.getParameter("username");
				return;
			}
			upload.setHeaderEncoding("UTF-8");
			List<FileItem> list = upload.parseRequest(request);

			for (FileItem item : list) {
				if (item.isFormField()) {
					// 为普通输入项
					String inputName = item.getFieldName();
					String inputValue = item.getString("UTF-8");
					// inputValue = new
					// String(inputValue.getBytes("iso8859-1"),"UTF-8");
					System.out.println(inputName + "=" + inputValue);
				} else {
					String filename = item.getName().substring(
							item.getName().lastIndexOf("\\") + 1); // ""
					if (filename == null || filename.trim().equals("")) {
						continue;
					}

					/*
					 * String ext =
					 * filename.substring(filename.lastIndexOf(".")+1);
					 * if(!types.contains(ext)){ request.setAttribute("message",
					 * "本系统不支持" + ext + "这种类型");
					 * request.getRequestDispatcher("/message.jsp"
					 * ).forward(request, response); return; }
					 */
					InputStream in = item.getInputStream();
					int len = 0;
					byte buffer[] = new byte[1024];
					String saveFileName = generateFileName(filename);
					String savepath = generateSavePath(this.getServletContext()
							.getRealPath("/WEB-INF/upload"), saveFileName);
					FileOutputStream out = new FileOutputStream(savepath
							+ File.separator + saveFileName);
					while ((len = in.read(buffer)) > 0) {
						out.write(buffer, 0, len);
					}
					in.close();
					out.close();
					item.delete(); // 删除临时文件
				}
			}
		} catch (FileUploadBase.FileSizeLimitExceededException e) {
			request.setAttribute("message", "文件大小不能超过5m");
			request.getRequestDispatcher("/message.jsp").forward(request,
					response);
			return;
		} catch (Exception e) {
			throw new RuntimeException(e);
		}
		request.setAttribute("message", "上传成功!!");
		request.getRequestDispatcher("/message.jsp").forward(request, response);
	}

	//
	public String generateSavePath(String path, String filename) {
		int hashcode = filename.hashCode(); // 121221
		int dir1 = hashcode & 15;
		int dir2 = (hashcode >> 4) & 0xf;

		String savepath = path + File.separator + dir1 + File.separator + dir2;
		File file = new File(savepath);
		if (!file.exists()) {
			file.mkdirs();
		}
		return savepath;
	}

	public String generateFileName(String filename) {
		return UUID.randomUUID().toString() + "_" + filename;
	}

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Servlet中实现多文件需要以下步骤: 1. 在HTML表单中设置enctype属性为"multipart/form-data",并且设置method为"POST"。 2. 在Servlet中获取HttpServletRequest对象,并通过该对象获取上文件信息。 3. 遍历HttpServletRequest对象中的文件信息,并将每个文件保存到服务器本地磁盘。 以下是一个示例Servlet代码: ```java import java.io.File; import java.io.IOException; import java.io.PrintWriter; import java.util.List; 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.FileItemFactory; import org.apache.commons.fileupload.disk.DiskFileItemFactory; import org.apache.commons.fileupload.servlet.ServletFileUpload; public class UploadServlet extends HttpServlet { private static final long serialVersionUID = 1L; public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html"); PrintWriter out = response.getWriter(); // 判断上表单是否为multipart/form-data类型 boolean isMultipart = ServletFileUpload.isMultipartContent(request); if (!isMultipart) { out.println("<html>"); out.println("<head>"); out.println("<title>Servlet upload</title>"); out.println("</head>"); out.println("<body>"); out.println("<h1>Invalid request type</h1>"); out.println("</body>"); out.println("</html>"); return; } // 创建一个FileItemFactory对象 FileItemFactory factory = new DiskFileItemFactory(); // 创建ServletFileUpload对象 ServletFileUpload upload = new ServletFileUpload(factory); try { // 解析上表单 List<FileItem> items = upload.parseRequest(request); for (FileItem item : items) { // 判断是否为文件域 if (!item.isFormField()) { // 获取上文件名称 String fileName = item.getName(); // 创建一个文件对象 File file = new File("c:/uploads/" + fileName); // 保存上文件到本地磁盘 item.write(file); } } // 显示上成功页面 out.println("<html>"); out.println("<head>"); out.println("<title>Servlet upload</title>"); out.println("</head>"); out.println("<body>"); out.println("<h1>Upload successful</h1>"); out.println("</body>"); out.println("</html>"); } catch (Exception e) { e.printStackTrace(); } } } ``` 在上面的示例中,使用了Apache Commons FileUpload API来解析上的表单数据。这个API提供了一种方便、可靠、高效的方式来处理文件

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值