Java Web上传数据图片文件

Java Web上传数据

上传图片的准备工作

1、标单method必须为post
2、提供file组件
3、设置form标签的enctyoe属性的值是multipart/form-data
如果没有multipart/form-data浏览器是获取不到图片的,获取到的只是文件名称

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
	<form action="/TestUpload/ServletDemo01" method="post" enctype="multipart/form-data">
	账户:<input type="text" name="username"><br/>
	密码:<input type="text" name="password"><br/>
	头像:<input type="file" name="userhead"><br/>
	<button>提交数据</button>
	</form>
</body>
</html>

分析上传的时候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}
		Map<String, String> map = new HashMap<String, String>();
		try {
			// 以下这3行语句对请求体的request对应的内容进行拆分包装
			// 通过request.getInputStream();获取到请求体的全部内容
			// 进行解析,将每对分隔线当中的内容分装在了FileItem
			DiskFileItemFactory fac = new DiskFileItemFactory();
			ServletFileUpload upload = new ServletFileUpload(fac);
			List<FileItem> 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 + "]";
	}
}
原创文章 76 获赞 151 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_44757034/article/details/105263261