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 协议的客户端编程工具包,并且它支持 ...
随机推荐
- Spring MVC请求执行流程
学习Spring MVC时间有点长了,但是最近打算找工作,需要重新了解下,所以又去温故知新了.Spring MVC就是用来写web的框架,简化你写web的一些不必要的流程,让程序员能专注于业务逻辑也就 ...
- 深入理解JAVA I/O系列六:Linux中的IO模型(转载的文章非常值得学习)
From:http://www.cnblogs.com/dongguacai/p/5770287.html IO模型 linux系统IO分为内核准备数据和将数据从内核拷贝到用户空间两个阶段. 这张图大 ...
- [C]字符串排序之-冒泡法
在oj刷题,遇见一题字符串排序题. 脑海里瞬间闪过数组排序. 思路有了,打开题解看看别人的思路,发现好多人的排序方法显得比较臃肿,可能也是我的水平不够,欣赏不来吧. 不过用冒泡法排序的时候一定要记得字 ...
- Git简易参考手册
如果用过mercury(HG),那么理解Git的运作方式就轻松多了.两者是相同的分布式版本管理工具,只是某些功能有着细微的差别 - Git的管理粒度更加细腻,因此操作上也比HG复杂一点.例如,修改文件 ...
- my new start
my new start in blog csdn : today i formally migrate my personal technical blog from sina to here in ...
- Web in Linux小笔记001
Linux灾难恢复: Root密码修复 Centos single Filesystem是硬盘文件根目录,无法再cd ..就像macitosh 硬盘图标 Pwd:显示绝对路径 MBR修复 模拟MBR被 ...
- (2)ES6解构赋值-数组篇
1.解构赋值-数组篇 //Destrcturing(解构) //ES5 /* var a = 1; var b = 2; var c = 3; */ //ES6 var [a,b,c] = [1,2, ...
- Alpha阶段-个人总结
一.五个问题 1.第三章中提到了"质量"和"按时交付"的问题,我想问,世事难料,当两者不能兼得的时候,我是保证质量却无法按时交付,还是水两下保证按时交付呢? 2 ...
- JAVA基础第一组(前5道题)
1.[程序1] 题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一 对兔子,假如兔子都不死,问每个月的兔子总数为多少? 1.程序分析: 兔 ...
- 【Alpha】——Fourth Scrum Meeting
一.今日站立式会议照片 二.每个人的工作 成员 昨天已完成的工作 今天计划完成的工作 李永豪 完善添加功能 测试统计功能 郑靖涛 完善删除功能 着手编写报表设计 杨海亮 完善查找功能 协助编写统计功能 ...