web上传以及细节

<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">commons-fileupload.jar</span>
commos-io.jar
上传三步走
·1工厂类 DiskFileItemFactory
·2解析器:servletFilteUpload
·3表单项:FilteItem 
1>创建工厂:直接new就行了
2>创建解析器:servletFilteUpload 直接new用工厂做参数
3>使用解析器的parserequest()方法解析,返回List《fileItem》类型
FilteItem类的方法
isFormFiled();判断是否是表单项
其他的查api
上传的细节:
1文件必须保存在WEB-InF下(不让浏览器直接访问)(防止上传的是.jsp,之后再直接访问,容易出问题)
2 文件名字问题,有时也需要切割
有的文件时绝对路径,
 *文件同名问题,需要添加名称前缀,保证不能重复
 》 finame=Communutils.uuid+"_"+filename;
3 目录打散问题 ,就是不能再一个文件夹下存的很多文件(防止太慢)
 >>自动去生成文件夹,首字母打散,首字母作为文件名称;
>>时间打散;使用当前日期作为目录;
>>哈希打散,通过文件名称得到int值 hashCode();
》他的int值转换成16进制
》通过13进制的前两位生成两层目录;比如是2b,侧有2目录,b目录;/1/b/
4 上传文件大小限制
#单个文件大小限制
# 所有文件大小限制

5缓存大小与临时目录

案例1

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
      <%@ taglib uri="http://java.sun.com/jstl/core" prefix="c" %>
<!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>Insert title here</title>
</head>
<body>
<form action="<c:url value='/Upload2Servlet'/>" method="post" enctype="multipart/form-data">
用户名:<input type="text" name="username"/><br/>
照片 :<input type="file" name="zhaopian"/><br/>
<input type="submit" value="上传"/>
</form>
</body>
</html>
package yuan.cn;

import java.io.File;
import java.io.IOException;
import java.util.List;

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

/**
 * Servlet implementation class Upload2Servlet
 */
@WebServlet("/Upload2Servlet")
public class Upload2Servlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request.setCharacterEncoding("utf-8");
		response.setCharacterEncoding("utf-8");
       DiskFileItemFactory dit=new DiskFileItemFactory();
       ServletFileUpload sf=new ServletFileUpload(dit);
       try {
		List<FileItem> file=sf.parseRequest(request);
		FileItem file1 = file.get(0);//总共两个项
		FileItem file2 = file.get(1);
		System.out.println("普通表单项"+file1.getFieldName()+"="+file1.getString("utf-8"));
		System.out.println("文件表单向");
		System.out.println("content_tyepe" +file2.getContentType());
		System.out.println("size"+file2.getSize());
		System.out.println("fileName"+file2.getName());
		file2.write(new File("E:\\baibing.jpg"));;
	} catch (Exception e) {
		// TODO Auto-generated catch block
		throw new RuntimeException(e);
	} 
	}

}
还有.jar包导入就行了

解决目录打散以及文件名字细节处理处理servlet方法
package yuan.cn;

import java.io.File;
import java.io.IOException;
import java.util.List;

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

import cn.itcast.commons.CommonUtils;

/**
 * Servlet implementation class Upload3Servlet
 */
@WebServlet("/Upload3Servlet")
public class Upload3Servlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

		
		//工厂
		DiskFileItemFactory df=new DiskFileItemFactory();
		ServletFileUpload sf=new ServletFileUpload(df);
		sf.setFileSizeMax(100*1024);//限制单个文件大小为100k;必须放在解析之前
		sf.setSizeMax(1024*1024);//限制整个表单大小为1M;
		try {
			List<FileItem> list=sf.parseRequest(request);//解析如果超过大小就会抛出异常
			FileItem fi=list.get(1);
			//目录打散hashcode
			//
			String root=this.getServletContext().getRealPath("/WEB-INF/files/");
			/**
			 * 生成两层目录
			 */
			String filename=fi.getName();
			int index=filename.lastIndexOf("\\");
			if(index!=-1){
				filename=filename.substring(index+1);
			}
			String savename=CommonUtils.uuid()+"_"+filename;
		int code=filename.hashCode();//转化成16进制
		String hex=Integer.toHexString(code);
		/**
		 * 获取hex的前两个字母,与root连接在一起生成完整的路径
		 */
		File dirfile=new File(root,hex.charAt(0)+"/"+hex.charAt(1));
		dirfile.mkdirs();
		File destFile=new File(dirfile,savename);
		fi.write(destFile);
		} catch (FileUploadException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		
	
	
	}

}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值