记一次Layui + Upload参数的获取的折腾

Java后台框架:SSM
目的:获取upload上传的图片,存入数据库最多4张
过程:
        js代码:
 


    

分析:
存入数据库四张图片,number:4 这个参参数只是限制用户同时最多只能上传4张,所以必须让请求链接携带上一个额外的参数number来表示已上传成功的数量,这个number参数会随着请求或返回来回跑~
如果number>4,则提示已成功上传了4张,其他继续上传的无效(即前面四张已存入数据库,之后的不会存入数据库),[hr]

在SpringMVC后台使用request解析得到List
 

@Controller
public class UploadController {
    
    /*
     * 上传图书缩略图,表面上是批量上传,实则是一个一个上传的
     */
    @RequestMapping("/shop/uploadBriefPic")
    @ResponseBody
    public String uploadBriefPic(HttpServletRequest request, HttpServletResponse response){
        String str = "";
        //获得磁盘文件
        DiskFileItemFactory diskFileItemFactory = new DiskFileItemFactory();
        //获取项目存放图片的真实路径
        String savepath = request.getServletContext().getRealPath("/bookpic/briefpic");//“/”表示WebRoot
        //设置 缓存的大小,当上传文件的容量超过该缓存时,直接暂存起来
        diskFileItemFactory.setSizeThreshold(10*1024*1024);
        ServletFileUpload upload = new ServletFileUpload(diskFileItemFactory);
        //3. 解析request得到List
        try {
            List list = (List)upload.parseRequest(request);//获得文件列表
                //判断文件列表是否为空
            if(list.size()==0 || list == null){
                str = "{\"code\": 0,\"msg\": \"上传的文件为空\"}";
                return str;
            }
             
            for(FileItem item : list){
                //获取表单的属性名字
                String Name = item.getFieldName();
                System.out.println("-----Name-------"+Name);
                if(item.isFormField()){//普通字段
                    System.out.println("--------普通字段------------");
                    String comField = item.getString() ;
                    String fieldName = item.getFieldName();
                    System.out.println("comField-------:"+comField);
                    System.out.println("fieldName----------:" + fieldName );
                }else{
                    if(item.getSize()>(355*1024)){//以字节为单位
                        str = "{\"code\": 355,\"msg\": \"文件不能大于355KB\"}";
                         return str;
                    }
//                        str = "{\"code\": 4,\"msg\": \"最先上传的4张已生效,其余的无效\"}";
//                         return str;
                        //获取图片的名字
                        String picName = item.getName();
                        //生成uuid作为图片名的一部分
                        String uuid = UUID.randomUUID().toString().replaceAll("-","");//原生的UUID携带了分隔符“-”
                        String newPicName = uuid+ "-" + picName;
                        OutputStream out = new FileOutputStream(new File(savepath,newPicName));
                        InputStream in = item.getInputStream() ;
                        int length = 0 ;
                        byte [] buf = new byte[1024] ;
                        // in.read(buf) 每次读到的数据存放在   buf 数组中
                        while( (length = in.read(buf) ) != -1){
                            //在   buf 数组中 取出数据 写到 (输出流)磁盘上
                            out.write(buf, 0, length);
                        }
                        in.close();
                        out.close();
                        str = "{\"code\": 100,\"msg\": \"\",\"data\": {\"src\":\"" + "bookpic/briefpic/"+newPicName + "\",\"bfpNum\":"+15+"}}";
                        System.out.println(str);
                        return str;
                }
            }
        } catch (FileUploadException e) {
            e.printStackTrace();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return str;
    }

发现参考了下面的各种方法,还是不能拿到额外参数number


参考链接01

参考链接02
参考链接03

我调试了好久,可能是SpringMVC使用request解析出现的一个bug ,这样写又会提示 “上传接口异常”
 

    @RequestMapping("/shop/uploadBriefPic")
    @ResponseBody
public String uploadBriefPic(@RequestParam(value="number") String number,HttpServletRequest request, HttpServletResponse response){

}


最后,我决定放弃了, 直接用返回的图片名字拼接进一个
 



然后通过拆分 value字符串来计算图片的数量,或上传到后台后进行拆分,并只存入数据库前4个图片名(最后4个也行)。

我上面写的,可能只有我自己看得懂,?,就当作写给自己看的吧,记录一下~

欢迎转载~
 

你可能感兴趣的:(Java,SSM,大前端)