Servlet+jsp文件上传及要注意的问题

文件上传要注意的问题:

1、非上传文件的乱码问题,此时通过request设置字符编码无效

2、上传文件的名字含有中文字符,会乱码

3、文件重名会覆盖

4、所有上传的文件要保存在不同的目录下面

5、可以设置文件上传的类型限制

6、可以设置文件上传大小

7、可以设置文件上传总量的大小

 

后面三个在代码中没有写,5,可以获取文件的后缀名,判断一下就行了,67 api更是有对应的方法,两行代码搞定了

 

package cn.web.upload;

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

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.tomcat.util.http.fileupload.FileItem;
import org.apache.tomcat.util.http.fileupload.disk.DiskFileItemFactory;
import org.apache.tomcat.util.http.fileupload.servlet.ServletFileUpload;

/**
 * Servlet implementation class UploadServlet
 */
@WebServlet("/UploadServlet")
public class UploadServlet extends HttpServlet {
       
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		try{
			DiskFileItemFactory factory = new DiskFileItemFactory();
			ServletFileUpload upload = new ServletFileUpload(factory);
			
			upload.setHeaderEncoding("UTF-8");//解决上传中文文件名字乱码问题
			
			if(!upload.isMultipartContent(request)){
				//不是上传文件表单,按照传统方式获取内容即可
				return;
			}
			Map<String,List<FileItem>> map = upload.parseParameterMap(request);
			
			String savepath = this.getServletContext().getRealPath("/WEB-INF/upload");
			int i = 0;
			for(Map.Entry<String,List<FileItem>> me : map.entrySet()){
				FileItem item = me.getValue().get(i);
				if(item.isFormField()){
					String name = item.getFieldName();
					String value = item.getString("UTF-8");//解决表单数据乱码的问题
//					value = new String(value.getBytes("iso8859-1"),"UTF-8");
					System.out.println(name + " = " + value);
				}else{
					InputStream in = item.getInputStream();
					String name = item.getName();	//得到文件的名字或者路径名+名字
					name = name.substring(name.lastIndexOf("\\") + 1);
					
					String fileName = this.makeFileName(name);//解决问价重名,覆盖的问题
					String realPath = this.makePath(fileName, savepath);//解决文件都在同一个目录下的问题
					
					File file = new File(realPath + "\\" + fileName);
					FileOutputStream out = new FileOutputStream(file);
					
					int len=0;
					byte buffer[] = new byte[1024];
					while((len=in.read(buffer))!=-1){
						out.write(buffer, 0, len);
					}
					out.close();
					in.close();
				}
			}
			
		}catch (Exception e){
			throw new RuntimeException(e);
		}
	}
	
	//为文件生成一个唯一的名字
	public String makeFileName(String name){
		return UUID.randomUUID().toString() + "_" + name;
	}
	//生成目录
	public String makePath(String fileName,String path){
		int hashCode = fileName.hashCode();
		int dir1 = hashCode&0xf;
		int dir2 = (hashCode&0xf0)>>4;
		String dir = path +"\\"+ dir1 +"\\" + dir2;
		File file = new File(dir);
		if(!file.exists()){
			file.mkdirs();
		}
		return dir;
	}
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doGet(request, response);
	}

}
 
<%@ page language="java" contentType="text/html; charset=UTF-8" 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> <form action="${pageContext.request.contextPath }/UploadServlet" method="post" enctype="multipart/form-data"> 姓名:<input type="text" name="name"/><br> 上传文件1:<input type="file" name="file1"/><br> 上传文件2:<input type="file" name="file2"/><br> <input type="submit" value="提交"/> </form> </body> </html>

注意:上传的文件一定要有enctype="multipart/form-data";这句话
 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值