form表单的enctype属性指明在将数据发送给服务器以前使用何种方式对将要发送的数据编码。html
application/x-www-form-urlencoded 是默认的编码方式java
multipart/form-data 不对字符编码ajax
text/plain 空格转换为 "+" 加号,但不对特殊字符编码浏览器
以这种格式提交数据时,浏览器会将字符串和文件看成一整个字节流发送到服务器服务器
经过特定的标记分隔开app
不一样的input之间的数据有一个分隔符,此分割符不是固定的,请求头包含该分隔符的信息异步
一个input框中的数据,会以 ‘\r\n’分隔,若是input是text类型的,其中会包含name和具体的值工具
若是是file类型的会包含filename,文件格式的信息,以后就是文件的字节流信息;post
混合表单提交是post提交演变而来的,参考博客https://www.cnblogs.com/tylerdonet/p/5722858.html编码
参考:http://blog.csdn.net/Chengyajie521/article/details/40888903
经过request对象的getInputStream()方法获取数据流,以multipart/form-data格式提交的数据是没法直接使用getParameter()方法获取字符串参数的,除非已经使用其余工具对request解析过了,使用getParameter()方法成功后,也就没法经过getInputStream()获取数据流了。
InputStream.read()方法的返回类型是int,该方法一次读取一个字节,Java中
byte占一个字节,有正负,范围是[-12八、127]
short占二个字节
char占二个字节,Java使用Unicode编码
int占四个字节
long占八个字节
而InputStream.read()方法返回的是一个unsigned byte [0 - 255],没法用byte接收
在http://blog.csdn.net/Chengyajie521/article/details/40888903中的方法,没法读取中文文件名,
因该使用UTF-8的编码去解析字符串
//使用commons-fileupload组件 //需引入commons-fileupload.jar和commons-io.jar //判断是否包含文件 ServletFileUpload.isMultipartContent(request); // 配置上传参数 DiskFileItemFactory factory = new DiskFileItemFactory(); // 设置内存临界值 - 超事后将产生临时文件并存储于临时目录中 factory.setSizeThreshold(MEMORY_THRESHOLD); // 设置临时存储目录 factory.setRepository(new File(System.getProperty("java.io.tmpdir"))); ServletFileUpload upload = new ServletFileUpload(factory); // 设置最大文件上传值 upload.setFileSizeMax(MAX_FILE_SIZE); // 设置最大请求值 (包含文件和表单数据) upload.setSizeMax(MAX_REQUEST_SIZE); // 中文处理 upload.setHeaderEncoding("UTF-8"); //获取request中的文件 List<FileItem> formItems = upload.parseRequest(request);
//将request转换成MultipartHttpServletRequest //前提是必须是以混合表单形式提交,不然报错 //form表单设置属性enctype="multipart/form-data" //异步提交可以使用jQuery.form.js的ajaxSubmit()方法 MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request; Iterator fileNames = multipartRequest.getFileNames();//能够上传一张也能够上传多张图片 //遍历获取文件 for (int i = 0; fileNames.hasNext(); ++i) { //form表单input标签name属性,表单中file框的name属性不能少,不然此处报错 String name = (String) fileNames.next(); MultipartFile myfile = multipartRequest.getFile(name); //原文件名 String OriginalFileName = myfile.getOriginalFilename(); //判断文件是否为空 myfile.isEmpty(); //获取输入流 myfile.getInputStream(); }
SpringMVC文件上传注意事项:表单中file框的name属性不能少
判断request是不是MultipartHttpServletRequest
// 建立一个通用的多部分解析器. CommonsMultipartResolver commonsMultipartResolver = new CommonsMultipartResolver(request.getSession().getServletContext()); // 设置编码 commonsMultipartResolver.setDefaultEncoding("utf-8"); // 判断是否有文件上传 if (commonsMultipartResolver.isMultipart(request)) {//有文件上传 //将request变成多部分request MultipartHttpServletRequest multiRequest=(MultipartHttpServletRequest)request; //获取multiRequest 中全部的文件名 Iterator<String> iter=multiRequest.getFileNames(); while (iter.hasNext()) { MultipartFile imageFile = multiRequest.getFile(iter.next().toString()); }