我们在写form提交表单的时候,后台大多数用request.getParameter的方式来接收前台输入的数据。但如果我们表单中提交的数据包含file文件传输的话,我们需要将Content-Type改为multipart/form-data。这时后台就不能再通过request.getParameter来获取表单的内容了。就需要通过request的输入流request.getInputStream来获取表单内容了。这里记录一种获取表单内容的方式,这种方式既可以获得表单的文本数据也可以获取图片的字节流

try {
String serverRealPath = request.getSession().getServletContext().getRealPath("/");
String path=serverRealPath+"saveImg";//文件保存路径
DiskFileItemFactory disk=new DiskFileItemFactory();
ServletFileUpload sfu=new ServletFileUpload(disk);
try {
List<FileItem> list=sfu.parseRequest(request);
for(FileItem file:list){
String fileName=file.getName();
if(fileName==null || "".equals(fileName)){
DataInputStream dataStream = new DataInputStream(
file.getInputStream());
ByteArrayOutputStream output = new ByteArrayOutputStream();
byte[] bytes = new byte[1024];
int n = 0;
while((n=dataStream.read(bytes))!= -1){
output.write(bytes, 0, n);
}
byte[] newbytes = output.toByteArray();
name = new String(newbytes,"UTF-8"); }else{
LOGGER.info("进入文件上传方法");
fileName=fileName.substring(fileName.lastIndexOf("\\")+1);
String extName=fileName.substring(fileName.lastIndexOf("."));//获取扩展.xxx
String newName=tarr_id+extName;//新名称
InputStream is = file.getInputStream();// 获取fileItem中的上传文件的输入流
FileOutputStream fos = new FileOutputStream(path+ File.separator + newName);// 创建一个文件输出流
byte buffer[] = new byte[1024];// 创建一个缓冲区
int length = 0;// 判断输入流中的数据是否已经读完的标识
while ((length = is.read(buffer)) > 0) {// 循环将输入流读入到缓冲区当中,(len=in.read(buffer))>0就表示in里面还有数据
fos.write(buffer, 0, length);// 使用FileOutputStream输出流将缓冲区的数据写入到指定的目录(savePath + "\\" +filename)当中
}
//按照id生存新的文件名称
filePath=newName;
LOGGER.info("file1_path的值为:"+newName);
is.close();// 关闭输入流
fos.close();// 关闭输出流
file.delete();// 删除处理文件上传时生成的临时文件
} }
} catch (Exception e) {
LOGGER.error("文件读取失败!");
e.printStackTrace();
}
} catch (Exception e) {
LOGGER.error("文件上传失败!");
e.printStackTrace();
}

这里可以将request内容转为一个FileItem的list,然后可以遍历这个list来获取表单的内容,如果其中包含文件的话,file.getName是可以获取文件名的,如果getName的值为空的话,就说明这个不是文件。然后可以通过file.getInputStream获取其输入流,然后将其输出成ByteArrayOutputStream 字节输出流,就可以获取内容。

表单Content-Type为multipart/form-data时,后台数据的接收的更多相关文章

  1. from 表单用 GET 方法进行 URL 传值时后台无法获取问题

    问题描述 <a href="${pageContext.request.contextPath}/client?method=add">点我</a> < ...

  2. myeclipse10 .jsp将表单提交给.java(form网页与后台通信初识)

    做毕设需要用到form通信. 以下几张截图来自极课学院 servlet jsp文件 web配置 出现错误: 路径问题 仍然不对,需要再改 <form action="servlet/S ...

  3. form 表单<input type="button" value="登录" onclick="loginSubmit ()"/> 点击提示 Uncaught TypeError: loginSubmit is not a function

    在网上搜了一堆东东,仔细看了一下,再加上实验,发现原因出在<form>中. <form method="post"> <button type=&qu ...

  4. 表单:!!!常用JS: form 表单代码

    手机(文本框): <input type="text" name="" maxlength="11" placeholder=&quo ...

  5. 当一个页面中有多个form表单并且有重名的元素时,js获取指定form表单中的指定元素

    有时候我们会在一个页面中写了多个form表单,碰巧多个form表单中又有相同名称的元素,而我们又不想改名字,这个时候就能用到 $("#form1 #div1").val() 好玩吧 ...

  6. 将任意一个jQuery对象进行表单序列化,免除了提交请求时大量拼写表单数据的烦恼,支持键值对<name&value>格式和JSON格式。

    http://zhengxinlong.iteye.com/blog/848712 将任意一个jQuery对象进行表单序列化,免除了提交请求时大量拼写表单数据的烦恼,支持键值对<name& ...

  7. input表单的type属性详解,不同type不同属性之间区别

    目标:详解表单input标签type属性常用的属性值 一.input标签和它的type属性 PS:input 元素可以用来生成一个供用户输入数据的简单文本框. 在默认的情况下, 什么样的数据均可以输入 ...

  8. 表单(上)EasyUI Form 表单、EasyUI Validatebox 验证框、EasyUI Combobox 组合框、EasyUI Combo 组合、EasyUI Combotree 组合树

    EasyUI Form 表单 通过 $.fn.form.defaults 重写默认的 defaults. 表单(form)提供多种方法来执行带有表单字段的动作,比如 ajax 提交.加载.清除,等等. ...

  9. 关于在用curl函数post网页数据时,遇上表单提交 type为submit 类型而且没有name和id时可能遇到的问题及其解决方法

    curl函数库实现爬网页内容的链接在 http://www.cnblogs.com/linguanh/p/4292316.html 下面这个是没有name和id 标识的 <input type= ...

  10. 进一步丰富和简化表单管理的组件:form.js

    上文<简洁易用的表单数据设置和收集管理组件>介绍了我自己的表单管理的核心内容,本文在上文的基础上继续介绍自己关于表单初始值获取和设置以及表单数据提交等内容方面的做法,上文的组件粒度很小,都 ...

随机推荐

  1. 云端的ABAP Restful服务开发

    愉快的暑假结束了,今天是小朋友新学期开学后的第一个周日,不知道各位家长是否和小朋友们一起,已经适应了新学期的生活了么? Jerry从少的可怜的属于自己的周末时光挤了一小部分时间出来,写了这篇文章. J ...

  2. lumen生成key

    在Lumen控制台运行php artisan key:generate提示: $ php artisan key:generate [Symfony\Component\Console\Excepti ...

  3. Formal Analysis of the TLS Handshake Protocol -----论文整理

    1.关键词  TLS.SSL.Formal Analsysis  Conridentiality  Secerecy 2.Table  THE SSL/TLS handshake Protocol 3 ...

  4. 用python批量插入数据到数据库中

    既然使用python操作数据库必不可少的得使用pymysql模块 可使用两种方式进行下载安装: 1.使用pip方式下载安装 pip install pymysql 2.IDE方式 安装完成后就可以正常 ...

  5. FontLab

    FontLab 字体制作软件

  6. Ajax的简单例子——PHP

    PHP PHP是一种创建动态交互性站点的服务器端脚本语言 PHP能够生成动态页面内容 PHP能够创建.打开.读取.写入.删除以及关闭服务器上的文件 PHP能够接收表单数据 PHP能够发送并取回cook ...

  7. 回调函数(callback)

    回调函数(callback) A "callback" is any function that is called by another function which takes ...

  8. SpringBoot项目启动报错:java.lang.RuntimeException: java.lang.reflect.InvocationTargetException

    .   ____          _            __ _ _ /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \( ( )\___ | '_ | '_| | ...

  9. 分页器,序列化组件,bulk_create,choices字段

    分页器 <!--前端--> {% for book in page_queryset %} <p>{{ book.title }}</p> {% endfor %} ...

  10. 安装pip的三种方式

    pip是python的一个工具,用来安装python包特别方便.Linux系统是是内置python程序,因为许多Linux内置文件都是使用python来编写的,比如说yum. 1.脚本安装 通过脚本的 ...