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图片上传就这么多东西

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

商朝

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值