java 文件上传

这几天无意中翻到自己的老代码,在此做一次开发笔记记录

文件上传:

前端使用的是layui的文件上传组件

后台使用的springboot框架


前端页面代码:

html:

<button type="button" class="layui-btn" id="test1"><i class="layui-icon">&#xe67c;</i>上传图片</button>

js:

  //普通图片上传
          var uploadInst = upload.render({
            elem: '#test1'
            ,url: '/uploadFile/uploadFile'
            ,data:{
                filetype:"1"
            }
              ,size:0
            ,before: function(obj){
              /* //预读本地文件示例,不支持ie8
              obj.preview(function(index, file, result){
                $('#demo1').attr('src', result); //图片链接(base64)
              }); */
            }
            ,done: function(res){
              //如果上传失败
              if(res.code > 0){
                return layer.msg('上传失败');
              }else if(res.code===0){//上传成功

                  zuo.department.image = res.fileid;
                  zuo.department.imageurl = res.fileurl;

                  
              }
              
            }
            ,error: function(){
              //演示失败状态,并实现重传
              var demoText = $('#demoText');
              demoText.html('<span style="color: #FF5722;">上传失败</span> <a class="layui-btn layui-btn-xs demo-reload">重试</a>');
              demoText.find('.demo-reload').on('click', function(){
                uploadInst.upload();
              });
            }
          });

后台java代码:

Application.java中加入

 /**  
     * 文件上传配置  
     * @return  
     */  
    @Bean  
    public MultipartConfigElement multipartConfigElement() {  
        MultipartConfigFactory factory = new MultipartConfigFactory();  
        //单个文件最大  
        factory.setMaxFileSize("10240KB"); //KB,MB  
        /// 设置总上传数据总大小  
        factory.setMaxRequestSize("102400KB");  
        return factory.createMultipartConfig();  
    }  

外部常量:

/**
     * 文件上传地址(pc)主文件夹(默认)
     */
    private String folder = "C://";
    
    /**
     * 文件上传地址(pc)文件夹(默认)
     */
    private String pcfile="upload/pcfiles/";
    
    /**
     * 图片文件名 filetype=1
     */
    private String image="image";
    
    /**
     * 文档 filetype=2
     */
    private String office="office";
    
    /**
     * 视频 filetype=3
     */
    private String video = "video";
    
    /**
     * 种子 filetype=4
     */
    private String bt = "bt";
    
    /**
     * 音乐 filetype=5
     */
    private String misic = "misic";
    
    /**
     * 其他 filetype=6
     */
    private String other = "other";

主方法:

    /***
     * 上传单个文件(普通文件上传)
     * 可js 直接调此方法,也可做工具接口
     * 同步方法
     * @param file
     * @param fileurl 存储地址:有则用,无则使用默认
     * @param filetype(1:图片,2:文档,3:视频,4:种子,5:音乐,6:其他)
     * @return 
     *     SUCCESS 成功/失败
     *     msg 提示内容
     *     fileid 文件id
     *     fileurl 访问文件的url
     */
    @RequestMapping("/uploadFile")
    @ResponseBody
    public synchronized Map<String, Object> uploadFilex(MultipartFile file,String fileurl,String filetype,HttpServletRequest request, HttpServletResponse response) {

        /**
         * 主方法块
         */
        Map<String, Object> result = new HashMap<String, Object>();
        HttpSession session = request.getSession();
        try {
            
            
            /**
             * 当前人
             */
            User user=(User)session.getAttribute("USER");
            
            /**
             *  这里的路径(可以自定义)
             */
            String filePath ="";
            /**
             * 图片访问地址
             */
            String url="";
            
            /**
             * 不传入类型(自动判断)
             */
            if(filetype==null){
                
                InputStream input = file.getInputStream();
                
                /**
                 * 判断文件类型
                 */
                Integer t = FileTypeJudge.isFileType(
                                 FileTypeJudge.getType(input));
                filetype=t.toString();
            }
            /**
             * 不同文件存放不同文件夹
             */
            if(fileurl==null||fileurl.equals("")){
                filePath=folder+pcfile;
                url = pcfile;
                if(filetype.equals("1")){//图片
                    filePath +=this.image;
                    url +=this.image;
                }else if(filetype.equals("2")){//文档
                    filePath +=this.office;
                    url +=this.office;
                }else if(filetype.equals("3")){//视频
                    filePath +=this.video;
                    url +=this.video;
                }else if(filetype.equals("4")){//种子
                    filePath +=this.bt;
                    url +=this.bt;
                }else if(filetype.equals("5")){//音乐
                    filePath +=this.misic;
                    url +=this.misic;
                }else{//其他
                    filePath +=this.other;
                    url +=this.other;
                }
            }else{
                filePath= fileurl;
            }
            /**
             * 获取图片上传的文件路径
             */
            File picFile = new File(filePath);
            /**
             *  判断文件夹是否存在,如果不存在就创建
             */
            if (!picFile.isDirectory()) {
                picFile.mkdirs();//mkdir创建单层文件夹;mkdirs创建多层文件夹
            }
            /**
             *  需要返回的文件名
             */
            String originalFilename = null;
            /**
             *  文件名前缀
             */
            String prefix = file.getOriginalFilename().substring(0,file.getOriginalFilename().lastIndexOf("."));
            /**
             *  文件后缀
             */
            String suffix = file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf("."),
                    file.getOriginalFilename().length());
            
            long size = file.getSize();
            
            /**
             * 处理大小
             */
            String filesize = getPrintSize(size);
            
            
            /**
             * 存入数据库(默认isdel=1)
             */
            WcFile wcFile = new WcFile();
            wcFile.setFilename(prefix);
            wcFile.setFiletype(filetype);
            wcFile.setFileformat(suffix);
            wcFile.setFilesize(filesize);
            wcFile.setCreatetime(new Date());
            wcFile.setCreateperson(user.getId()+"");
            wcFile.setUpdatetime(new Date());
            wcFile.setUpdateperson(user.getId()+"");
            wcFile.setIsdel("1");//文件未上传之前,默认删除
            wcFile.setStatus("0");//未上传
            wcFileService.insert(wcFile);//存库,返回id
            int id = wcFile.getId();
            
            /**
             *  生成新的文件名(UUID加入+_+文件id)避免冲突
             */
            String uuid = UUID.randomUUID().toString().replaceAll("-", "");
            originalFilename = uuid +"_"+id + suffix;
            /**
             *  这里不必处理IO流关闭的问题,因为FileUtils.copyInputStreamToFile()方法内部会自动把用到的IO流关掉
             *  此处也可以使用Spring提供的MultipartFile.transferTo(File dest)方法实现文件的上传
             */
            file.transferTo(new File(filePath, originalFilename));
             /**
              * FileUtils.copyInputStreamToFile(myfile.getInputStream(), new
              * File(filePath, originalFilename));
              * 图片压缩
              **/
            
            /**
             * 上传成功后(更新对应文件数据)
             */
            url = url+"/"+originalFilename;
            wcFile.setFileurl(url);//存入文件地址
            wcFile.setIsdel("0");//显示
            wcFile.setStatus("1");//上传成功
            wcFileService.updateByPrimaryKey(wcFile);
            
            /**
             * 封装富文本图片反馈url(http://localhost:8080/upload/test.html)
             */
            String url2=request.getScheme()+"://"+ request.getServerName()+":"+request.getLocalPort();
            Map<String, Object> result2 = new HashMap<String, Object>();
            result2.put("src",url2+"/"+url);
            
            
            result.put("code", 0);//layui 识别成功
            result.put("SUCCESS", true);
            result.put("msg", "上传成功");
            result.put("data", result2);
            result.put("fileid", wcFile.getId());
            result.put("fileurl", url);//访问地址;如:upload/pcfiles/xxxx.xx
            return result;
        } catch (Exception e) {
            e.printStackTrace();
            result.put("SUCCESS", false);
            result.put("msg", "上传失败");
            return result;
        }
    }

其中加入了自动判断文件格式部分

见博客文章:java文件上传,自动判断文件类型

其中数据库操作部分,需修改为自己项目中相关操作

原文地址:https://www.cnblogs.com/zktww/p/11016697.html