javaWeb文件上传-image示例

文件的上传主要分成两个步骤
(1)用户在页面中选择要上传的文件,然后将请求提交到Servlet
(1)Servlet收到请求,解析用户上传的文件,然后将文件存储到服务器
创建上传文件的表单
1.创建一个form表单

<form action="" method="post" enctype="multipart/form-data">
    <input type="file" name="file" /><br /><br />
    <input type="submit" value="上传" />
</form>

文件上传的表单和之前的表单类似,但有以下内容需要注意
(1)表单的method属性必须为post
(2)表单的enctype属性必须为multipart/form-data
(3)上传文件的控件是intput,type属性为file
2.编写Servelet。
页面的表单控件创建好以后,选中文件点击上传按钮请求将会提交到指定的Servlet来处理。
注意:这里不能再像以前的Servlet中那样,通过request.getParamter()来获取请求参数了,当enctype=”multipart/form-data” 时,再使用getParamter()获取到内容永远为空。因为浏览器发送请求的方式已经改变。
既然以前的方法不能使用了,这里我们必须要引入一个新的工具来解析请求中的参数和文件,这个工具就是commons-fileupload。
commons-fileupload
commons-fileupload是Apache开发的一款专门用来处理上传的工具,它的作用就是可以从request对象中解析出,用户发送的请求参数和上传文件的流。
commons-fileupload包依赖commons-io,两个包需要同时导入。
核心类:
1.DiskFileItemFactory
工厂类,用于创建ServletFileUpload,设置缓存等
该类一般直接使用构造器直接创建实例
方法:
public void setSizeThreshold(int sizeThreshold)
用于设置缓存文件的大小(默认值10kb)
public void setRepository(File repository)
用于设置缓存文件位置(默认系统缓存目录)
2.ServletFileUpload
该类用于解析request对象从而获取用户发送的请求参数(包括普通参数和文件参数)
该类需要调用有参构造器创建实例,构造器中需要一个DiskFileItemFactory作为参数
方法:
public List parseRequest(HttpServletRequest request)
解析request对象,获取请求参数,返回的是一个List,List中保存的是一个FileItem对象,一个对象代表一个请求参数。
public void setFileSizeMax(long fileSizeMax)
设置单个文件的大小限制,单位为B
如果上传文件超出限制,会在parseRequest()抛出异常
FileSizeLimitExceededException。
public void setSizeMax(long sizeMax)
限制请求内容的总大小,单位为B
如果上传文件超出限制,会在parseRequest()抛出异常
SizeLimitExceededException。
3.FileItem
该类用于封装用户发送的参数和文件,也就是用户发送来的信息将会被封装成一个FileItem对象,我们通过该对象获取请求参数或上传文件的信息。
该类不用我们手动创建,由ServletFileItem解析request后返回。
方法:
String getFieldName()
获取表单项的名字,也就是input当中的name属性的值。
String getName();
获取上传的文件名,普通的请求参数为null。
String getString(String encoding);
获取内容
若为文件,将文件的流转换为字符串。
若为请求参数,则获取请求参数的value。
encoding参数需要指定一个字符集
boolean isFormField();
判断当前的FileItem封装的是普通请求参数,还是一个文件。
如果为普通参数返回:true
如果为文件参数返回:false
String getContentType();
获取上传文件的MIME类型
long getSize();
获取内容的大小
servlet代码示例:

//创建工厂类
DiskFileItemFactory factory = new DiskFileItemFactory();
//创建请求解析器
ServletFileUpload fileUpload = new ServletFileUpload(factory);
//设置上传单个文件的的大小
fileUpload.setFileSizeMax(1024*1024*3);
//设置上传总文件的大小
fileUpload.setSizeMax(1024*1024*3*10);
//设置响应内容的编码
response.setContentType("text/html;charset=utf-8");
try {
    //解析请求信息,获取FileItem的集合
    List<FileItem> items = fileUpload.parseRequest(request);
    //遍历集合
    for (FileItem fileItem : items) {
        //如果是普通的表单项
        if(fileItem.isFormField()){
            //获取参数名
            String fieldName = fileItem.getFieldName();
//获取参数值
            String value = fileItem.getString("utf-8");
            System.out.println(fieldName+" = "+value);
            //如果是文件表单项
        }else{
            //获取文件名
            String fileName = fileItem.getName();
            //获取上传路径
            String realPath = getServletContext().getRealPath("/WEB-INF/upload");
            //检查upload文件夹是否存在,如果不存在则创建
            File f = new File(realPath);
            if(!f.exists()){
                f.mkdir();
            };
            //为避免重名生成一个uuid作为文件名的前缀
            String prefix = UUID.randomUUID().toString().replace("-", "");
            //将文件写入到服务器中
            fileItem.write(new File(realPath+"/"+prefix+"_"+fileName));
            //清楚文件缓存
            fileItem.delete();
        }
}
} catch (Exception e) {
    if(e instanceof SizeLimitExceededException){
        //文件总大小超出限制
        response.getWriter().print("上传文件的总大小不能超过30M");
    }else if(e instanceof FileSizeLimitExceededException){
        //单个文件大小超出限制
        response.getWriter().print("上传单个文件的大小不能超过3M");
    }
} 
response.getWriter().print("上传成功");
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值