java 文件上传

来源:互联网 发布:软件概要设计说明书 编辑:程序博客网 时间:2024/05/18 02:17

file上传需要依赖的jar包:commons-fileupload
maven添加

<dependency>      <groupId>commons-fileupload</groupId>      <artifactId>commons-fileupload</artifactId>      <version>1.3.1</version>    </dependency>

(用于解析2进制数据)

文件上传需要使用的三个类

类DiskFileItemFactory
将表单数据封装,存在一个临界值,当上传的文件小于这个值时,文件被直接存放在内存中,当文件大于这个值会被存放在临

时文件夹中,可以通过System.getProperty(“java.io.tmpdir”)获取临时文件夹地址

构造方法
1、public DiskFileItemFactory()
采用默认的临界值和默认的临时文件夹够着对象
2、DiskFileItemFactory(int sizeThreshold,File repository)
采用自定义临界值和系统临时文件夹够着对象
3、FileItem createItem()
不需要自己调用,组件会自己调用

类ServletFileUpload(处理文件类)
构造方法
1、public ServletFileUpload()
直白点这个无参构造函数没有什么用
2、 public ServletFileUpload(FileItemFactory fileItemFactory)
构造以filefactory的实例

常用方法
1、setSizeMax(long sizeMax)/getSizeMax
设置获取请求文件的大小,以防止客户端恶意上传文件
2、setFileSizeMax
设置单个文件上传的大小
3、 public List parseRequest(javax.servlet.http.HttpServletRequest req)
将http请求消息解析,将form表单的每个input分装成单独的fileitem对象,然后将其加入到
list集合中
4、public FileItemIterator getItemIterator(HttpServletRequest request)
与3方法相同,返回的是迭代器
5、public stiatc boolean isMultipartContent(HttpServletRequest req)
静态方法,判断请求方式是否是“multipart/form-data”类型
6、public void setHeaderEncoding()
设置请求文本中的字符编码

类FileItem
常用方法
1、boolean isFormField()。isFormField方法用来判断FileItem对象里面封装的数据是一个普通文本表单字段,还是一个文

件表单字段。如果是普通文本表单字段,返回一个true否则返回一个false。因此可以用该方法判断是否是普通表单域还是文件

上传表单域。
2、String getName()。getName方法用来获得文件上传字段中的文件名。
3、String getFieldName()。getFieldName方法用来返回表单标签的name属性的值。
4、void write(File file)。write方法将FileItem对象中的内容保存到某个指定的文件中。如果FileItem对象中的内容是保存

在某个临时文件中,该方法完成后,临时文件可以会被删除。该方法也可以将普通表单字段保存在一个文件中,但最主要的用

途是把上传的文件内容保存在本地文件系统中。
5、String getString()。getString()方法将FileItem对象中保存的数据流内容以一个字符串返回。它有两个重载形式。

public java.lang.String getString()和public java.lang.String getString(java.lang.String encodeing) throws

java.io.UnsupportedEncodingException。前者使用缺省的字符集编码将主体内容转换成字符串,后者使用参数指定的字符集

编码。如果在读取普通表单字段元素的内容时,出现了乱码现象,可以调用第二个方法,并传入 正确的字符集编码名称。
6、String getContentType()。此方法用来获得上传文件的类型,即标段字段元素描述头属性“content-type”的值,如

image/jpeg。如果FileItem对象对应的是普通的表单字段,将返回null。
7、boolean isInMemory()。判断FileItem对象封装的数据是保存在内存中还是硬盘中。
8、void delete()。此方法用来清空FileItem对象中封装的主体内容,如果内容是被保存在临时文件中,该方法会把临时文

件删除。
9、InputStream getInputStream()。以流的形式返回上传文件的主体内容。
10、long getSize()。返回上传文件的大小。

demo

客户端

<!DOCTYPE html><html lang="en"><head>    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">    <meta http-equiv="pragma" content="no-cache" />    <base target="_self">    <title>文件上传</title></head><body><!--注意enctype属性--><form method="post" action="/user/addHeadImg" enctype="multipart/form-data">    <input name = "img" type ="file" class ="text1" size ="40" maxlength="40" onchange="uploadfile(this)">    <span id="UPtip" style="color:red;font-size:1.5rem"></span>    <input type="submit" value="确定"></form></body></html>

服务端

package cn.saleNc.controller;import javax.json.Json;import javax.servlet.http.HttpServletRequest;import cn.saleNc.dao.UserDao;import cn.saleNc.model.User;import cn.saleNc.service.UserService;import cn.saleNc.uitl.ResultData;import com.fasterxml.jackson.databind.ObjectMapper;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 org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.RequestBody;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RequestMethod;import org.springframework.web.bind.annotation.ResponseBody;import org.springframework.web.multipart.MultipartFile;import javax.annotation.Resource;import javax.servlet.http.HttpServletResponse;import javax.servlet.http.HttpSession;import java.io.*;import java.util.Date;import java.util.Iterator;import java.util.List;import java.util.Random;@Controller@RequestMapping("/user")public class UserController {    private File file;    private String filePath ;    @RequestMapping("/addHeadImg")    public String addHeadImg(HttpServletRequest req, HttpServletResponse resp){        //判断用户是否登录        HttpSession session = req.getSession();        User user = (User) session.getAttribute("user");        //对照片在服务存储位置进行获取        if (filePath == null){            filePath = req.getSession().getServletContext().getRealPath("UploadUserHeadImg");            File file = new File(filePath);            if ( !file.exists()){                file.mkdir();            }        }        //判断是否是multipart/form-data类型  提交方式        if (ServletFileUpload.isMultipartContent(req)){            //设置图片上传的缓冲区            DiskFileItemFactory factory =new DiskFileItemFactory();//            System.out.println(System.getProperty("java.io.tmpdir"));            //设置文件上传大小            ServletFileUpload sfu = new ServletFileUpload(factory);            sfu.setFileSizeMax(5 * 1024 * 1024);  //限制大小为5mb            sfu.setHeaderEncoding("utf-8");            //获取post请求里面的元素            try {                List<FileItem> fileList = sfu.parseRequest(req);                Iterator<FileItem> fileItemIterator = fileList.iterator();                while (fileItemIterator.hasNext()){                    FileItem fileItem = fileItemIterator.next();                    //对普通表单元素进行获取                    if (fileItem.isFormField()){                        //获取键值对                        String key = fileItem.getFieldName();                        String value = fileItem.getName();                        System.out.println("key值:"+ key +"对应的value值:" + value);                    }else {                        //对上传文件进行处理                        //对照片名字进行唯一处理                        String uploadName = fileItem.getName();                        String fileType = uploadName.substring(uploadName.indexOf("."));                        String newName = new Date().getTime() + fileType;                        System.out.println("newName:"+ newName);                        System.out.println("filePath:"+ filePath);                        //将文件写入进服务器中                        File file = new File(filePath+"/" + newName);                        fileItem.write(file);                        //删除文件缓冲                        fileItem.delete();                        //存入数据库(用户name和头像的图片地址url)                        if (user != null){                        }                    }                }            } catch (FileUploadException e) {                e.printStackTrace();            } catch (Exception e) {                e.printStackTrace();            }        }        return "views/result";    }}

注意
需要在maven添加依赖

<dependency>      <groupId>commons-fileupload</groupId>      <artifactId>commons-fileupload</artifactId>      <version>1.3.1</version>    </dependency>