servlet文件上传2——复合表单提交(数据获取和文件上传)
上传文件时表单enctype属性必须要更改为<enctype='multipart/form-data'>;采用post提交表单,元素需要有name属性;
利用第三方jar包(commons-fileupload-1.2.1.jar commons-io-1.3.2.jar )进行普通数据获取和文件上传;普通文本需要用getString("编码格式")方法获取,否则汉字会出现乱码,最开始我一直用的getString()获取,发现传到数据的数据全是乱码,查看流浪器的里面的请求和响应全是正常的,百度了半天也没找到真正的解决方法,无意间发现第三方包里面的FileItem还有一个重载的getString(String args)方法,但是不晓得参数传什么;后来发现这个getString(String args)方法会抛一个
添加商品的Servlet:
package ni.jun.yang.servlet; import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.List; import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import ni.jun.yang.service.KindService; @WebServlet("/AddGoodsServlet")
public class AddGoodsServlet extends HttpServlet {
private static final long serialVersionUID = 1L; public AddGoodsServlet() {
} protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//响应编码格式
response.setCharacterEncoding("utf-8");
PrintWriter out = response.getWriter();
//遍历类型的集合,得到下拉框选项
List<String> list = new ArrayList<>();
String sql = "Select * from kind";
list = new KindService().select(sql);
out.println("<html><head><meta charset='utf-8'><title>添加商品</title>");
out.println("</head>");
out.println("<body>");
//上传文件的提交方式
out.println("<form action='AddResultServlet' method='post' enctype='multipart/form-data'>");
out.println("<table>"); out.println("<tr>");
out.println("<td>名称:</td>");
out.println("<td><input type='text' name='mingzi'></td>");
out.println("</tr>"); out.println("<tr>");
out.println("<td></td>");
out.println("<td><input type='file' name='filename'></td>");
out.println("</tr>"); out.println("<tr>");
out.println("<td>介绍:</td>");
out.println("<td><input type='text' name='jieshao'></td>");
out.println("</tr>"); out.println("<tr>");
out.println("<td>售价:</td>");
out.println("<td><input type='text' name='shoujia'></td>");
out.println("</tr>"); out.println("<tr>");
out.println("<td>分类:</td>");
out.println("<td>");
out.println("<select name='fenlei'>");
//遍历类型的集合,得到下拉框选项
for (int i = 0;i<list.size();i++) {
out.println("<option value="+(i+1)+">");
out.println(list.get(i));
out.println("</option>");
}
out.println("</select>");
out.println("</td>");
out.println("</tr>"); out.println("<tr>");
out.println("<td> </td>");
out.println("<td><input type='submit' value='添加'></td>");
out.println("</tr>");
out.println("</table>");
out.println("</form>");
out.println("</body>");
out.println("</html>"); }
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
处理提交数据的Servlet:
package ni.jun.yang.servlet; import java.io.File;
import java.io.IOException;
import java.util.Date;
import java.util.List; import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; 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 ni.jun.yang.bean.Goods;
import ni.jun.yang.service.GoodsService; @WebServlet("/AddResultServlet")
public class AddResultServlet extends HttpServlet {
private static final long serialVersionUID = 1L; public AddResultServlet() { }
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("UTF-8"); DiskFileItemFactory factory = new DiskFileItemFactory();
factory.setSizeThreshold(1024*1024*5);
ServletFileUpload upload = new ServletFileUpload(factory);
List<FileItem> fileItems = null;
Goods goods = new Goods();
try {
//请求数据返回FileItem类型的数组
fileItems = upload.parseRequest(request);
} catch (FileUploadException e) { e.printStackTrace();
}
//上传的文件存放路径
String path = getServletContext().getRealPath("/image");
File f = new File(path);
//没有此路径就创建
if(!f.exists()){
f.mkdirs();
}
//遍历请求数据的集合进行数据的获取和文件的上传
for (FileItem x : fileItems) {
try {
uploading(x, goods, path);
} catch (Exception e) { e.printStackTrace();
}
}
//普通数据存入数据库,页面跳转
if(new GoodsService().add(goods)){
request.getRequestDispatcher("success.html").forward(request, response);
}else{
response.sendRedirect("lose.html");
} }
/**
* 数据的获取和文件上传
* @param fileItem
* @param goods 待添加的商品
* @param path 上传的路径
* @throws Exception
*/
private void uploading (FileItem fileItem,Goods goods,String path) throws Exception{
//普通文本数据
//只能获取字符串,其他的数据需要通过包装类的方法转化得到
if(fileItem.isFormField()){
if(fileItem.getFieldName().equals("mingzi")){
//获取普通的文本数据利用getString("utf-8"),设置编码格式。否则会出现汉字乱码
goods.setName(fileItem.getString("utf-8")); }else if(fileItem.getFieldName().equals("jieshao")){
goods.setExplain(fileItem.getString("utf-8")); }else if(fileItem.getFieldName().equals("shoujia")){
//字符串转Double
goods.setPrice(Double.parseDouble(fileItem.getString())); }else if(fileItem.getFieldName().equals("fenlei")){
String type = fileItem.getString();
goods.setType(Integer.parseInt(type)); }
}else{
// 文件类型
String fileName = fileItem.getName();
// System.out.println(fileName);
//设置上传的文件名字,利用时间返回毫秒数,保证上传的文件不重名
String path1 = new Date().getTime()+"_"+fileName;
String fileName2= path+"\\"+ path1;
File file = new File(fileName2);
//数据只存放文件名字
goods.setPhoto(path1);
// System.out.println(fileName2);
try {
fileItem.write(file);
} catch (Exception e) {
e.printStackTrace();
}
}
} protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response);
} }
效果图:


完整项目网盘地址:http://pan.baidu.com/s/1boWm05T 密码:blqh
servlet文件上传2——复合表单提交(数据获取和文件上传)的更多相关文章
- layui框架实现多图片手动上传和随表单提交方法
首先在官方文档并没有手动上传的说明文档,这里手动实现上传原理是:在表单中有三个按钮,分别是上传图片按钮.隐藏上传按钮.表单提交按钮,点击上传图片按钮之后,图片添加在前端但是并没有真正的上传,而是在点击 ...
- Servlet的5种方式实现表单提交(注册小功能)
Servlet的5种方式实现表单提交(注册小功能),后台获取表单数据 用servlet实现一个注册的小功能 ,后台获取数据. 注册页面: 注册页面代码 : <!DOCTYPE html> ...
- Linux curl 模拟form表单提交信息和文件
Linux curl 模拟form表单提交信息和文件 curl是一个命令行方式下传输数据的开源传输工具,支持多种协议:FTP.HTTP.HTTPS.IMAP.POP3.TELNET等,功能超级强大 ...
- c# 模拟表单提交,post form 上传文件、大数据内容
表单提交协议规定:要先将 HTTP 要求的 Content-Type 设为 multipart/form-data,而且要设定一个 boundary 参数,这个参数是由应用程序自行产生,它会用来识别每 ...
- Yii2表单提交(带文件上传)
今天写一个php的表单提交接口,除了基本的字符串数据,还带文件上传,不用说前端form标签内应该有这些属性 <form enctype="multipart/form-data&quo ...
- js_ajax模拟form表单提交_多文件上传_支持单个删除
需求场景: 用一个input type="file"按钮上传多张图片,可多次上传,可单独删除,最后使用ajax模拟form表单提交功能提交到指定方法中: 问题:由于只有一个file ...
- 使用bean接收ajax表单提交数据包含文件上传
这几天写带图片上传的表单提交,一个配置小程序活动弹出框样式的功能,记录一下一些需要注意的地方 首先是 前端 JSP 文件的表单 <form class="search-wrapper& ...
- c# 模拟表单提交,post form 上传文件、数据内容
转自:https://www.cnblogs.com/DoNetCShap/p/10696277.html 表单提交协议规定:要先将 HTTP 要求的 Content-Type 设为 multipar ...
- Java后台使用httpclient入门HttpPost请求(form表单提交,File文件上传和传输Json数据)
一.HttpClient 简介 HttpClient 是 Apache Jakarta Common 下的子项目,用来提供高效的.最新的.功能丰富的支持 HTTP 协议的客户端编程工具包,并且它支持 ...
随机推荐
- Eclipse知识
http://www.runoob.com/eclipse/eclipse-create-jar-files.html Eclipse 生成jar包 打开 Jar 文件向导 Jar 文件向导可用于将项 ...
- Tornado框架简介
-------------------简介------------------- 1.概念: Tornado全称Tornado Web Server,是一个用Python语言写成的Web服务器 ...
- struts2和spring mvc的比较
详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt236 Struts2 Springmvc 机制 基于filt ...
- java常见面试题(二)
1.java集合类 Collection是最基本的集合接口,一个Collection代表一组Object,即Collection的元素(Elements).JavaSDK不提供直接继承自Collect ...
- js函数防抖、节流实现
防抖 Debounce 函数防抖就是,延迟一段时间再执行函数,如果这段时间内又触发了该函数,则延迟重新计算: // 简单实现 function debounce(fn, wait) { let t r ...
- 二:搭建一个webpack3.5.5项目:建立项目的webpack配置文件
第一步: npm init -y [初始文件] npm info webpack / bower info webpack[查看版本,用bower的时候要先 npm install bower] np ...
- 使用imageLoader加载图片资源
- Seesion工作原理
session的工作原理一.术语session 在我的经验里,session这个词被滥用的程度大概仅次于transaction,更加有趣的是transaction与session在某些语境下的含义是相 ...
- SNS团队第四次站立会议(2017.04.25)
一.当天站立式会议照片 本次会议主要内容:汇报工作进度,根据完成情况调整进度 二.每个人的工作 成员 今天已完成的工作 明天计划完成的工作 罗于婕 相关数据库文件建立起来 完善数据库文件 龚晓婷 研 ...
- Alpha 版本测试和发布说明
Alpha版本测试报告 一bug汇总 做题时答案是错的.(已修复) 每次生成的题目一样(已经修复) 计时没有显示即倒计时,难度不同的功能没有实现(打算修复) 没有导入试卷和错题功能(不打算修复) 二. ...