目录
前言:
在现实生活中,我们有着各种各样的需求,其中有些需求需要用户传入的特定图片,让数据库可以保存图片的信息
所需软件与jar包:
ideal tomcat
jar包地址:文件上传jar包
业务流程:
从浏览器选择图片,然后通过post/get请求发送给服务器,再由服务器进行图片的操作
前台展示:
上传图片:
1.选择上传文件的前端代码:
<input type="file" name="desc"required lay-verify="required" autocomplete="off" class="layui-input">
2.提交给服务器:
<form class="layui-form" method="post" action="/love/updateProduct.do" enctype="multipart/form-data">
注: enctype="multipart/form-data" 要加到表单里面才能上传文件
3.前台完整代码:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
<title>新增</title>
<link rel="stylesheet" href="//unpkg.com/layui@2.6.8/dist/css/layui.css">
<!-- 引入 layui.js -->
<script src="//unpkg.com/layui@2.6.8/dist/layui.js">
</script>
</head>
<body>
<form class="layui-form" method="post" action="/love/insertProduct.do" enctype="multipart/form-data">
<div class="layui-form-item">
<label class="layui-form-label">商品编号:</label>
<div class="layui-input-block">
<input type="text" name="id" required lay-verify="required" autocomplete="off" class="layui-input"
value="${product.id}" hidden>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">商品名称:</label>
<div class="layui-input-block">
<input type="text" name="name" required lay-verify="required" autocomplete="off" class="layui-input">
</div>
</div>
<%-- 提交图片的input--%>
<div><label class="layui-form-label">商品图片:</label><input type="file" name="image"></div>
<div class="layui-form-item">
<label class="layui-form-label">商品价格:</label>
<div class="layui-input-block">
<input type="text" name="price" required lay-verify="required" autocomplete="off" class="layui-input">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">所属分类:</label>
<div class="layui-input-block">
<select name="type" lay-verify="required">
<option></option>
<c:forEach var="type" items="${productTypes}">
<option value="${type.id}">${type.product_type_name}</option>
</c:forEach>
</select>
</div>
</div>
<%-- 商品详情图片--%>
<div class="layui-form-item">
<label class="layui-form-label">商品详情:</label>
<div class="layui-input-block">
<input type="file" name="desc" required lay-verify="required" autocomplete="off" class="layui-input">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">商品品牌编号:</label>
<div class="layui-input-block">
<select name="brand" lay-verify="required">
<option></option>
<c:forEach var="brand" items="${brands}">
<option value="${brand.id}">${brand.brand_name}</option>
</c:forEach>
</select>
</div>
</div>
<%-- 提交--%>
<div class="layui-form-item">
<div class="layui-input-block">
<button class="layui-btn" lay-submit lay-filter="formDemo">立即提交</button>
<button type="reset" class="layui-btn layui-btn-primary">重置</button>
</div>
</div>
</form>
</body>
</html>
后台代码:
当我们将前台提供的数据传给服务器的时候,有普通的文本数据和文件数据。文件数据我们需要转换为二进制流在进行传输。首先我们就需要先判断是否是文件数据,如果不是文件数据就不用二进制化
详细代码如下:
package com.dmdd.servelt;
import com.dmdd.service.ProductServiceImpl;
import com.dmdd.utils.MD5Utils;
import org.apache.commons.fileupload.FileItemIterator;
import org.apache.commons.fileupload.FileItemStream;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.apache.commons.fileupload.util.Streams;
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 java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.UUID;
@WebServlet("/insertProduct.do")
public class InsertProductServlet extends HttpServlet {
int x = 0;
public static final String UPLOAD_DIR = "E:\\upload\\eshop\\";
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ServletFileUpload upload = new ServletFileUpload();
//设置可上传的文件大小
if (ServletFileUpload.isMultipartContent(req)) {
try {
FileItemIterator itemIterator = upload.getItemIterator(req);
String name = null, price = null, type = null, createTime = null, brand = null, image = null, desc = null, id = null;
while (itemIterator.hasNext()) {
FileItemStream item = itemIterator.next();
if (item.isFormField()) {
String value = Streams.asString(item.openStream(), "UTF-8");
switch (item.getFieldName()) {
case "name":
name = value;
break;
case "price":
price = value;
break;
// case "createTime":createTime=value;
case "type":
type = value;
break;
case "brand":
brand = value;
break;
case "id":
id = value;
break;
}
} else {
//创建文件夹
File file = new File(UPLOAD_DIR);
if (!file.exists()) {
file.mkdir();
}
//截取后缀名
//获得文件名
String fileName = item.getName();
String substring = fileName.substring(fileName.lastIndexOf("."));
desc = UUID.randomUUID().toString().replace("-", "") + substring;
if (x == 0) {
image = desc;
x++;
}
Streams.copy(item.openStream(), new FileOutputStream(UPLOAD_DIR + desc), true);
}
}
//统一加密 id type brand
id = MD5Utils.encrypt(id);
// type = MD5Utils.encrypt(type);
// brand = MD5Utils.encrypt(brand);
ProductServiceImpl productService = new ProductServiceImpl();
//获取当前时间
LocalDateTime now = LocalDateTime.now();
DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
createTime = now.format(dateTimeFormatter);
System.out.println(createTime);
productService.executeUpdate("insert into s_product (id,product_name,product_image,price,product_type,product_desc,create_time,product_brand) values(?,?,?,?,?,?,?,?)", id, name, image, price, type, desc, createTime, brand);
resp.sendRedirect("/love/selectProduct.do");
} catch (FileUploadException e) {
e.printStackTrace();
}
}
}
}
代码功能解读:
ServletFileUpload upload = new ServletFileUpload();创建一个文件上传对象
//设置可上传的文件大小 upload.setFileSizeMax(1024*1024*10);
ServletFileUpload.isMultipartContent(req)判断发送的请求是否符合 就是看是否包含enctype="multipart/form-data"
FileItemIterator itemIterator = upload.getItemIterator(req);创建迭代器,迭代的对象为发送过来的input中的数据
itemIterator.hasNext()开始迭代
FileItemStream item = itemIterator.next();获取迭代对象
FileItemStream item = itemIterator.next();item.isFormField()判断本次迭代的对象是文件类型还是普通文本类型
item.getFieldName()得到jsp中input 的name值
String value = Streams.asString(item.openStream(), "UTF-8");将input框中的value值获取到。
Streams.copy(item.openStream(), new FileOutputStream(UPLOAD_DIR + desc), true);一种io流的简写方式,就是用了特定的jar包。
以上的api是关于文件上传的api,当然后台代码中的api可不止这些。但是我就不一一讲解了,大家一定都懂。