上传

1.上传对表单限制
method="post"
enctype="multipart/form-data"
<input type="file" name="FileName"/>
2上传对Servlet限制
    requset.getParametere()在表单enctype="multipart/form-data"时,作废(返回值为null)
    这时使用ServletInputStream request.getInputStream();包含整个请求体
    
分割出多个部件,一个表单项一个部件
一个部件中包含请求头和空行,以及请求体
普通表单项:1个头:Content-Disposition:包含name=""(表单名称),一个体(表单项的值)
文件表单项
2个头:Content—Disposition:包含name=""(表单名称),filename=""(上传的文件名)
       Content-Type:上传文件的MIME类型
1个体:上传文件的内容

commoms-fileupload
依赖commons-io
commoms-fileupload将解析request中的上传数据,解析结果为一个表单数据,
并将其封装到一个FileItem对象中。
对其进行操作:
创建工厂:DiskFactory
创建解析器:ServletFileUpload
解析request,得到FileItem
==========
FileName
-String isFormField():判断是否为普通表单项
-String getFieldName():返回表单项的名称
-String getString(String charset):返回表单项的值
-String getName():返回上传的文件名称
-long getSize():返回上传文件的字节大小
-InputStream getInputStream():返回上传文件的输入流
-void write(File destFile):把上传文件的内容保存到指定位置
================
注意
====
1.文件必须保存到WEB-INF下,不让浏览器直接访问
2.文件名称问题:
有的浏览器上传的文件名是绝对路径,这是需要切割字符串,得到文件名
文件名乱码或普通表单项乱码,使用request.setCharacteEncoding();
上传文件同名:为每个文件添加名称前缀
3.上传文件大小限制
4.缓存大小与临时目录    

超出缓存(默认10kb),直接向硬盘(临时目录)保存

package com.web.servlet;

import java.io.File;
import java.io.IOException;
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.FileUploadBase;
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;

public class UploadServlet extends HttpServlet {

	
	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		request.setCharacterEncoding("utf-8");
		response.setContentType("text/html;charset=utf-8");
		
		//创建工厂
		DiskFileItemFactory factory = new DiskFileItemFactory(20*1024,new File("F:/temp"));
		//获取解析器
		ServletFileUpload sfu = new ServletFileUpload(factory);
		/*
		 * 设置上传文件的大小限制
		 * */
		sfu.setFileSizeMax(1024*1024);//限制单个文件不超过1M
		sfu.setSizeMax(2*1024*1024);//限制整个表单大小不超过2M
		//解析request,得到List<FileItem>
		List<FileItem> list;
		try {
			list = sfu.parseRequest(request);
			FileItem fi = list.get(1);
			
			//得到文件保存路径
			String path = 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;//给文件添加uuid前缀,处理文件同名问题
			
			//得到hashCode
			int hCode = filename.hashCode();
			String hex = Integer.toHexString(hCode);
			
			//获取前两个字母,与root连接在一起,生成一个完整的路径
			File dirFile = new File(path,hex.charAt(0)+"/"+hex.charAt(1));
			dirFile.mkdir();//创建目录链
			File destFile = new File(dirFile,savename);//创建目录文件
			
			//写入
			try {
				fi.write(destFile);
			} catch (Exception e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			
		} catch (FileUploadException e) {
			if(e instanceof FileUploadBase.FileSizeLimitExceededException) {
				request.setAttribute("msg", "您上传的文件超出了100KB!");
				request.getRequestDispatcher("/form3.jsp").forward(request, response);
			}
			e.printStackTrace();
		}
		
		
	}

}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值