JAVAWEB实现图片文件上传

目录

一、导入jar包

二、转换表单

三、实现文件上传

四、FileItem对象的常用方法

五、FileUpload


一、导入jar包

导入jar包commons-io-2.2.jar和commons-fileupload-1.4.jar两个包 可以从官网直接下

二、转换表单

在表单中,添加一个enctype="multipart/form-data"设置。提交方式必须使用post形式

使用encrype设置为二进制表单

前端测试代码

<form action="tupian.do" method="post" enctype="multipart/form-data">
        <input type="file" name="photo">
        <input type="text" name="uname">
        <input type="submit" value="提交">
    </form>

三、实现文件上传

工具类可以直接调用,注意需要修改request.getServletContext().getRealPath("/");路径为自己保存的路径

使用FileUpload实现数据的上传的步骤

步骤一:创建FileItemFactory

步骤二:ServletFileUpload

步骤三:设置对request进行解析ServletFileUoload.parseRequest

步骤四;获取到所有表单中的字段FileItem

步骤五:判断是否是一个文件

步骤六:将文件上传到对应位置

代码如下

package controller;

import domain.UserInfo;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileItemFactory;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;

import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.List;
import java.util.UUID;

public class RegistController extends HttpServlet {
    protected void doPost(HttpServletRequest req, HttpServletResponse reap) throws IOException {
        FileItemFactory factory=new DiskFileItemFactory();
        ServletFileUpload fileUpload=new ServletFileUpload(factory);
        List<FileItem> fileItems=null;
        try {
            fileItems=fileUpload.parseRequest(req);
        } catch (FileUploadException e) {
            throw new RuntimeException(e);
        }
        UserInfo userInfo=new UserInfo();
        for(FileItem fileItem:fileItems){
            if(fileItem.isFormField()){
                if("username".equals(fileItem.getFieldName())){
                    userInfo.setLoginName(fileItem.getString("utf-8"));
                }else if("password".equals(fileItem.getFieldName())){
                    userInfo.setPassword(fileItem.getString());
                }else if("email".equals(fileItem.getFieldName())){
                    userInfo.setEmail(fileItem.getString());
                }else {
                    userInfo.setMobile(fileItem.getString());
                }
                }else{
                    String realFile=req.getServletContext().getRealPath("/upload/headphone");
                    File realDir=new File(realFile);
                    if(!realDir.exists()){
                        realDir.mkdirs();
                    }
                    String fileName=fileItem.getName();
                    String extName = fileName.substring(fileName.lastIndexOf(".")) ;
                    String newName= UUID.randomUUID().toString()+extName;
                    File uploadFile=new File(realFile,newName);
                    try {
                        fileItem.write(uploadFile);
                    } catch (Exception e) {
                        throw new RuntimeException(e);
                    }
                    userInfo.setHeadphone("upload/headphone"+newName);
                reap.sendRedirect("/login.jsp");
            }
        }

    }
}

四、FileItem对象的常用方法

System.out.println(fileItem.getFiledName());//获取表单传输的name

System.out.println(fileItem.getName()); //只有是上传文件内容时,才能够获取到文件名称

System.out.println(fileItem.getSize());//获取到文件大小

System.out.println(fileItem.getString());//获取到当前FileItem对应值

System.out.prinln(fileItem.getContentType());//是上传文件内容时,才能获取到文件类型

System.out.prinln(fileItem.isFormField());//如果是普通字段,该值就是true,否则就是false

五、FileUpload

enctype为表单提交时所采取的传输编码方式,默认为application/x-www-form-urlencode,在默认情况下对于上传的文件只能获取一个文件名。为了能够传输文件内容就需要采用multipart/form-data,此时提交表单后请求体中会对文件进行解析,若为其他属性直接获取它的值,不同的属性会以分割线分割.

核心类:

DiskFileItemFactory:磁盘文件项工厂,是文件上传的核心类,其他操作都依靠该对象进行
ServletFileUpload:服务解析类,用于解析Servlet服务中的request请求,可以调用该类的方法parseRequest(HttpServletRequest request)解析请求中的参数,返回一个List集合类型为FileItem
FileItem:请求参数的实体类,用于存放参数。可以调用getString(String encoding)方法获取普通属性的值,getName()获取属性的名称。对于文件参数可以通过isFormField()方法判断,返回为true为普通属性,false为文件属性。FileItem类提供了获取文件输入流的方法getInputStream()用于文件IO操作。

构造方法
1) public DiskFileItemFactory()

      采用默认临界值和系统临时文件夹构造文件项工厂对象。

2) public DiskFileItemFactory(int sizeThreshold,File repository)

      采用参数指定临界值和系统临时文件夹构造文件项工厂对象。

3) FileItem createItem()
       根据DiskFileItemFactory相关配置将每一个请求消息实体项目创建成DiskFileItem 实例,并返回。该方法从来不需要我们亲自调用,FileUpload组件在解析请求时内部使用。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值