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文件上傳,自動判斷文件類型

其中數據庫操作部分,需修改為自己項目中相關操作

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM