Java Web上传数据图片文件
发布日期:2021-06-29 15:01:27
浏览次数:3
分类:技术文章
本文共 6065 字,大约阅读时间需要 20 分钟。
Java Web上传数据
上传图片的准备工作
1、标单method必须为post
2、提供file组件 3、设置form标签的enctyoe属性的值是multipart/form-data 如果没有multipart/form-data浏览器是获取不到图片的,获取到的只是文件名称Insert title here
分析上传的时候HTTP协议的格式
POST /TestIpload/ServletDemo01 HTTP/1.1
请求头: 请求头: 请求头: 图片二进制数据,代表图片自身 如果设置了表单form标签的enctype的属性之后,请求体部分的内容的格式发生了更改username=tom&password=1234&userhead=11.bmp
创建一个Servlet获取页面提交到的数据
测试代码
ServletDemo01
public class ServletDemo01 extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub doGet(request, response); } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // String username = request.getParameter("username");// null // String password = request.getParameter("password");// null // String userhead = request.getParameter("userhead");// null // System.out.println(username + "=" + password + "=" + userhead); // request.getParameter(name);获取到的是 请求体部分为键值对或者说浏览器路径后键值对的数据 // 现在请求体的内容已经不是键值对了 // 通过request对象获取到一个输入流对象 InputStream is = request.getInputStream(); // 打印输入流当中的对象 int i = is.read();//将所有的数据放入到int 类型的i当中 while (i != -1) { char c = (char) i; System.out.print(c); i = is.read(); } }}
控制台输出内容
可以看到服务端接收到相关的数据包括username password 图片的编码 结论: 1、如果设置了mutipart/form-data,在服务端是无法通过request.getParameter(name);获取数据的2、可以通过request.getInputStream();获取请求体部分的数据
具备手动实现上传的可行性利用一个上传的commons-fileupload jar包来实现上传数据的功能
思路:
1、导入架包后2、执行很简单的3行语句,((1)读取请求体部分的数据【将分隔线当中的内容分装成为一个对象】)
3、就可以获取到一个集合,
4、集合里面放入的是对象,将每对分隔线当中的内容分装在了FileItem对象上
5、遍历集合
6、如果当前的FileItem的对象是普通项
将普通项上的name属性的值作为键,将获取到内容作为值放入到map集合当中 {username 《=》 tom , password 《=》1234}7、如果当前的FileItem对象是上传项
通过FileItem获取到输入流对象,通过输入流对象获取到图片的二进制数据, 在服务端创建一个空文件(后缀必须和上传到服务端文件名的后缀一致) 建立和空文件对应输出流 将输入流当中的数据刷到输出流当中 释放资源 向map当中存入一个键值对的数据 userhead <==> /images/11.bmp {username 《=》 tom , password 《=》1234,userhead《=》image/11.bmp}8、利用BeanUtils将MAP中的数据填充到一个对象上
9、service——dao将user上携带的数据存入到数据仓库,从定向到一个查询全部商品信息路径步骤实现:
1、导入jar包 百度去—》 创建ServletDemo01的Servlet对象同时导入入beanutlist相关的架包
beanutlist的作用是将map集合上键值和user相符的数据,放置到user对象上(1) BeanUtils相关包
commons-beanutils-1.8.3.jar commons-beanutils-1.8.3-javadoc.jar commons-beanutils-1.8.3-javadoc.jar commons-beanutils-bean-collections-1.8.3.jar commons-beanutils-core-1.8.3.jar (2) Logic4j相关包 commons-logging.jar
public class ServletDemo01 extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub doGet(request, response); } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // MAP目的:是携带数据{username <==> tom,password <==> 1234,userhead<==>/images/11.bmp} Mapmap = new HashMap (); try { // 以下这3行语句对请求体的request对应的内容进行拆分包装 // 通过request.getInputStream();获取到请求体的全部内容 // 进行解析,将每对分隔线当中的内容分装在了FileItem DiskFileItemFactory fac = new DiskFileItemFactory(); ServletFileUpload upload = new ServletFileUpload(fac); List list = upload.parseRequest(request);// 将页面当中的数据传入到 // 遍历集合 for (FileItem item : list) { if (item.isFormField()) { // 判断其是否是普通项 // 5、如果当前的FileItem对象是普通项 // 将普通项上的name属性的值作为键,将获取到内容作为值放入到map集合当中 // {username 《=》 tom , password 《=》1234} // System.out.println(item.getString("utf-8")+".....普通项"); // 将普通项以键值对的方式将其放入到mop集合当中包括其name和与其对应的值 map.put(item.getFieldName(), item.getString("utf-8")); } else { // 这里是上传数据的项 // 7、如果当前的FileItem对象是上传项 // 通过FileItem获取到输入流对象,通过输入流对象获取到图片的二进制数据, // 在服务端创建一个空文件(后缀必须和上传到服务端文件名的后缀一致) // 建立和空文件对应输出流 // 将输入流当中的数据刷到输出流当中 // 释放资源 // 向map当中存入一个键值对的数据 userhead <==> /images/11.bmp // {username 《=》 tom , password 《=》1234,userhead《=》image/11.bmp} // 8、利用BeanUtils将MAP中的数据填充到一个对象上 // 9、service——dao将user上携带的数据存入到数据仓库,从定向到一个查询全部商品信息路径 // System.out.println(item.getFieldName()); // System.out.println(item.getName()); // System.out.println(item.getString()); // item.getInputStream();//推荐通过此api来获取图片的数据 // 通过FileItem获取到输入流对象,通过输入流对象获取到图片的二进制数据, InputStream is = item.getInputStream(); // 这里获取到的是文件夹在计算机当中实际的路径 String realPath = getServletContext().getRealPath("/images/img");// 获取到项目下文件的真实路径 File file = new File(realPath, item.getName());// 将路径和对应的图片名称放入到 // 判断该文件名称的文件在当前路径当中是否存在 // 在服务端创建一个空文件(后缀必须和上传到服务端文件名的后缀一致) if (!file.exists()) { // 如果不存在 file.createNewFile();// 就创建该文件 } // 建立和空文件对应输出流 OutputStream os = new FileOutputStream(file); // 将输入流当中的数据刷到输出流中 IOUtils.copy(is, os); // 释放资源 IOUtils.closeQuietly(is); IOUtils.closeQuietly(os); // 将从客户端获取到的图片的名称以及其对应的路径放入到map集合当中,,,通过上面的数据已经将实际的数据图片放入到项目当中对应的文件当中 map.put("userhead", "/images/img" + item.getName()); } } // 8、利用BeanUtils将MAP中的数据填充到一个对象上 // 9、service——dao将user上携带的数据存入到数据仓库,从定向到一个查询全部商品信息路径 BeanUtils.populate(user, map); } catch (Exception e) { e.printStackTrace(); } }}
创建User类
package com.itzheng.cn;public class User { private String username; private String passowrd; private String userhead; public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassowrd() { return passowrd; } public void setPassowrd(String passowrd) { this.passowrd = passowrd; } public String getUserhead() { return userhead; } public void setUserhead(String userhead) { this.userhead = userhead; } public User() { // TODO Auto-generated constructor stub } public User(String username, String passowrd, String userhead) { super(); this.username = username; this.passowrd = passowrd; this.userhead = userhead; } @Override public String toString() { return "User [username=" + username + ", passowrd=" + passowrd + ", userhead=" + userhead + "]"; }}
转载地址:https://code100.blog.csdn.net/article/details/105263261 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
路过按个爪印,很不错,赞一个!
[***.219.124.196]2024年04月26日 03时31分08秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
Go-多路选择和超时控制
2019-04-29
Go-channel的关闭和广播
2019-04-29
Go-任务的取消
2019-04-29
AIX 作为Web Server 使用时,tcp相关的几个参数调整
2019-04-29
自我学习37:请描述一下网页从开始请求到最后展示的完整过程
2019-04-29
自我学习38:如何区分前后端BUG
2019-04-29
自我学习39:接口自动化测试用例&功能测试用例区别
2019-04-29
mirror去兔子补丁下载 附安装教程
2019-04-29
mirror去兔子补丁 v3.0附安装教程
2019-04-29
mirror去兔子补丁为什么还有兔子_mirror去兔子补丁使用教程
2019-04-29
3dmax2012安装教程
2019-04-29
OC渲染器(Octane Render)整合版安装包 附安装教程
2019-04-29
操作系统期末大题复习
2019-04-29
hive:分区表,hbase外表
2019-04-29
想要成为运维,想要成为后期的架构师?这些知识是必备的!
2019-04-29
linux 是如何 快速一键安装禅道的呐?
2019-04-29
运维面试基础试题(四)
2019-04-29
一键安装Openstack单节点 必能成功
2019-04-29
面试紧张怎么办
2019-04-29
关系型数据库 ,nosql数据库简介
2019-04-29