利用JAVA实现文件上传
Demo01
servlet下的图片上传功能
前端代码: upload.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h3>文件上传</h3>
<!--文件上传必须post请求 因为上传数据太大 get请求不能超过4k
设置编码类型必须设置 -->
<form action="upload" method="post" enctype="multipart/form-data">
<input type="text" name="title" placeholder="图片标题">
<input type="file" name="pic">
<input type="submit" value="上传">
</form>
</body>
</html>
UploadServlet代码
package cn.tedu.controller;
import cn.tedu.dao.PicDao;
import cn.tedu.entity.Pic;
import javax.servlet.ServletException;
import javax.servlet.annotation.MultipartConfig;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.Part;
import java.io.File;
import java.io.IOException;
import java.util.UUID;
/**
* 页面中设置了编码类型为多部份数据
* 所以servlet必须添加以下注解
*/
@MultipartConfig
@WebServlet(name = "UploadServlet", urlPatterns = "/upload")
public class UploadServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//设置字符集
request.setCharacterEncoding("UTF-8");
String title = request.getParameter("title");
System.out.println("title=" + title);
//获取上传的文件
Part part = request.getPart("pic");
//获取上传文件的信息 需要从上面获取文件的后缀名
String info = part.getHeader("content-disposition");
System.out.println(info);
//name="pic"; filename="c.jpg"
//从上面内容中截取.jpg
String suffix = info.substring(info.lastIndexOf("."), info.length() - 1);
System.out.println("后缀:" + suffix);
//获取唯一文件名 UUID.randomUUID() 获取唯一标识
String fileName = UUID.randomUUID() + suffix;
System.out.println(fileName);
//在HTML中只能显示tomcat管辖内的图片,
//所以必须将图片保存在tomcat管辖范围内
//获取tomcat管辖范围的路径
String path = request.getServletContext().getRealPath("images/");
System.out.println(path);
//创建出文件夹
new File(path).mkdirs();
//把文件保存在images文件夹下
part.write(path + fileName);
System.out.println("文件保存完成!");
//把title和图片路径封装到Pic对象中
Pic pic = new Pic(0, title, "images/" + fileName);
//调用PicDao 调用insert方法
new PicDao().insert(pic);
//重定向到图片列表页面
response.sendRedirect("/piclist");
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
}
ThUtils工具类
package cn.tedu.utils;
import org.thymeleaf.TemplateEngine;
import org.thymeleaf.context.Context;
import org.thymeleaf.templateresolver.ClassLoaderTemplateResolver;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
public class ThUtils {
private static TemplateEngine te;
static {
//创建模板引擎对象
te = new TemplateEngine();
//创建解析器 该解析器会自动查找src/main/resources目录下的模板页面
ClassLoaderTemplateResolver r =
new ClassLoaderTemplateResolver();
//设置字符集
r.setCharacterEncoding("UTF-8");
//让解析器和模板引擎关联
te.setTemplateResolver(r);
}
//Context导包 org.thymeleaf.Context
public static void print(String fileName,Context context,
HttpServletResponse response) throws IOException {
//将页面和数据整合到一起的到一个新的html字符串 整合!!!
String html = te.process(fileName, context);
//把得到的新的html返回给浏览器 异常抛出
response.setContentType("text/html;charset=utf-8");
PrintWriter pw = response.getWriter();
pw.print(html);
pw.close();
}
}
Demo02
vrd项目实现图片上传操作
前端代码
<form action="send" method="post"
enctype="multipart/form-data">
<div class="form-group">
<label for="title">标题</label> <input type="text"
class="form-control" id="title" name="title"
placeholder="请输入作品标题">
</div>
<div class="form-group">
<label for="aabstract">作者姓名</label> <input type="text"
class="form-control" id="aabstract" name="author"
placeholder="请输入作者姓名">
</div>
<div class="form-group">
<label for="intro">作品简介</label>
<textarea class="form-control" rows="4" id="intro"
name="intro" >无详细介绍</textarea>
</div>
<div class="form-group">
<label >选择分类</label>
<select name="categoryId">
<option th:each="c :${list}" th:value="${c.id}" th:text="${c.name}"></option>
</select>
</div>
<div class="form-group">
<label >选择文件</label> <input type="file" id="file"
name="file">
</div>
<div class="text-center">
<button type="submit" class="btn btn-danger btn-lg ">发布作品</button>
</div>
</form>
对应的SendServlet代码
package cn.tedu.controller;
import cn.tedu.dao.ProductDao;
import cn.tedu.entity.Product;
import javax.servlet.ServletException;
import javax.servlet.annotation.MultipartConfig;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.Part;
import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.UUID;
@MultipartConfig
@WebServlet(name = "SendServlet",urlPatterns = "/send")
public class SendServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("UTF-8");
String title = request.getParameter("title");
String author = request.getParameter("author");
String intro = request.getParameter("intro");
String categoryId = request.getParameter("categoryId");
//获取上传的文件
Part part = request.getPart("file");
//获取上传的文件信息
String info = part.getHeader("content-disposition");
System.out.println("info:"+info);
//截取 .jpg
String suffix=info.substring(info.lastIndexOf("."),info.length()-1);
String filename= UUID.randomUUID()+suffix;
System.out.println("文件名:"+filename);
//获得tomcat的管辖路径
String path = request.getServletContext().getRealPath("/images");
//将日期对象按照上面的格式转换 /yyyy/MM/dd/
SimpleDateFormat sdf = new SimpleDateFormat("/yyyy/MM/dd/");
String dateDir = sdf.format(new Date());
System.out.println("日期路径为:"+dateDir);
System.out.println("完整路径为:"+path+dateDir);
//创建文件夹
new File(path+dateDir).mkdirs();
//把文件保存到文件夹
part.write(path+dateDir+filename);
ProductDao productDao = new ProductDao();
productDao.insert(new Product(0, title, author,
intro, "images/"+dateDir+filename, 0, 0, System.currentTimeMillis(), Integer.parseInt(categoryId)));
//重定向到首页
response.sendRedirect("/home");
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
}
Demo03
上传轮播图图片文件
前端代码
<div class="row">
<!--左侧主要内容-->
<div class="col-md-offset-2 col-md-8">
<!--遍历轮播图集合-->
<div th:each="b:${list}">
<img th:src="${b.url}" class="img-responsive" alt="">
<a th:href="'deletebanner?id='+${b.id}" class="btn btn-danger">删除</a>
</div>
<!--添加轮播图-->
<hr>
<h2 class="page-head