servlet接收二进制请求(图片上传),解决getParameter拿不到值得问题

图片上传

一般前端来的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图片上传就这么多东西

猜你喜欢

转载自blog.csdn.net/t_t2_3/article/details/113665373