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>
- Java 文件上传 JQ 文件上传
- java文件上传原理
- java文件上传原理
- java上传文件
- 上传文件 JSP+java
- JAVA上传文件
- java上传文件
- java fileupload上传文件
- java-文件上传案例
- JAVA上传EXCEL文件
- java上传文件
- java 超大文件上传
- java上传文件实例
- java 文件上传
- JAVA 上传文件类
- JAVA之"文件上传"
- java文件上传
- java文件上传方法
- 2018深信服研发试题A-单链表排序
- 实现添加删除排序修改
- codevs1183 泥泞的道路
- html表单笔记
- Android开发工程面试题
- java 文件上传
- imagerloader(简单写法)
- BZOJ2429[HAOI2006]聪明的猴子(最小生成树)
- Http请求中post和get的区别
- Fragment+Fragment上的自动无限轮播+XListView
- 使用Glide获取图片缓存大小以及清除缓存
- java_SSM框架浅析
- BZOJ 4517 [Sdoi2016]排列计数 数论
- 2017-9-17pat甲级 C