图片上传
一般前端来的request 到servlet的service往下一分直接getParameter("…")就能拿参数,
如果是前端通过el-upload 里面action发过来的,那抱歉不能直接接收,因为是二进制的请求格式,我是这么做的
插件
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.4</version>
</dependency>
单独创一个servlet分一个新的路由地址用来接图片
package com.etoak.student.controller;
import com.alibaba.fastjson.JSONObject;
import com.etoak.student.entity.Pic;
import com.etoak.student.response.resp;
import com.etoak.student.service.StudentService;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileItemFactory;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.List;
import java.util.UUID;
import java.io.*;
@WebServlet("/student/pic")//分的子路由
public class PicServlet extends HttpServlet {
//一个统一写response的方法
private static void writeRes(resp res, HttpServletResponse servletResponse){
try{
servletResponse.setContentType("text/json;charset=UTF-8");
PrintWriter pw =servletResponse.getWriter();
String json = JSONObject.toJSONString(res);
pw.print(json);
pw.flush();
pw.close();
}catch (Exception e){
e.printStackTrace();
}
}
//接图片
public void doPost(HttpServletRequest request, HttpServletResponse response) {
//转编码格式
try {
request.setCharacterEncoding("utf-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
FileItemFactory f =new DiskFileItemFactory();
ServletFileUpload su =new ServletFileUpload(f);
try{
List<FileItem> items =su.parseRequest(request);
if(items.size()>0){
FileItem item =items.get(0);
if(!item.isFormField()){
//文件名字
String name =item.getName();
//文件后缀
String fExt =name.substring(name.lastIndexOf("."));
//为了避免重复 改名
String newName = UUID.randomUUID().toString().replaceAll("-","")+fExt;
ServletContext application =this.getServletConfig().getServletContext();
String path = application.getRealPath("/files/"+newName);
//把图片保存路径放到数据库以备下次使用
item.write(new File(path));
Pic pic =new Pic();
pic.setRealname(name);
pic.setCover(0);
//这里和保存的路径一样 就是files改名之后的文件名字
pic.setPath("/files/"+newName);
//下面就是其他逻辑了 更新外键用的
StudentService ss =new StudentService();
ss.addPic(pic);
pic=ss.selectPic(pic);//有了主键
resp res =new resp();
res.setCode("200");
res.setData(pic);
res.setMsg("存储图片成功");
writeRes(res,response);
}
}
} catch (FileUploadException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
}
不过在io流write那里 哪个files文件夹还没有 我们需要在target里面建一个
前台来的图片就保存在这里了
ok图片上传就这么多东西