您的位置:首页 > 其它

上传

2016-04-23 20:34 309 查看
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();
}

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: