1. 程式人生 > >SpringMVC 上傳下載

SpringMVC 上傳下載

下面介紹一下SpringMVC對檔案的上傳和下載,
注意:上傳檔案和下載檔案不能使用Ajax請求,必須是form表單提交

上傳

springMVC配置檔案的配置:

 <!-- 上傳檔案直譯器 --> 
    <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
     <property name="maxUploadSize" value="104857600" />
     <property
name="maxInMemorySize" value="4096" />
<property name="defaultEncoding" value="UTF-8"></property> </bean>

Java後臺

  • contorller層:
    /**
     * 上傳檔案
     * @param file
     * @param request
     * @param session
     * @return
     */
    @RequestMapping("upLoadFile")
    @ResponseBody
public ResponseEntity upLoadFile(@RequestParam("addUploadFile") CommonsMultipartFile file,HttpServletRequest request,HttpSession session){ Date date=new Date(); SimpleDateFormat sdfTime=new SimpleDateFormat("yyyy-MM-DD HH:mm:ss"); try{ List<Resource> resourceList=resourceService.findByResourceName(request.getParameter("addResourceName"
)); if(resourceList.size()!=0){//判斷使用者名稱是否存在 return ResponseEntity.status(ResponseVoConstant.BADREQUEST). data(null).errorMessage(MessageUtil.getMessageValue("PROJECT_NAME_ALREADY_EXIST")); } String path="/PMS_Resource/"+request.getParameter("addProjectId");//檔案儲存路徑 File newfile=new File(path,file.getOriginalFilename()); if (!newfile.exists()) { //判斷檔案的路徑是否存在 newfile.mkdirs(); //如果檔案不存在 在目錄中建立資料夾 這裡要注意mkdir()和mkdirs()的區別 } file.transferTo(newfile); Resource resource=new Resource(); resource.setResourceName(request.getParameter("addResourceName"));//資源名 resource.setResourceAddress(newfile.getPath()); resource.setPorjectId(Integer.parseInt(request.getParameter("addProjectId")));//專案ID resource.setUploadUserId(Integer.parseInt(session.getAttribute("userId").toString())); resource.setUploadTime(sdfTime.parse(sdfTime.format(date))); resource.setResourceBrief(request.getParameter("addResourceBrief"));//資源簡介 resourceService.save(resource);//儲存資源資訊 }catch (Exception e) { return ResponseEntity.status(ResponseVoConstant.BADREQUEST). data(null).errorMessage(MessageUtil.getMessageValue("SAVE_FAIL")); } return ResponseEntity.status(ResponseVoConstant.OK). data(null).errorMessage(MessageUtil.getMessageValue("UPLOAD_SUCCESS")); }

此時檔案就儲存到這個路徑下:

String path="/PMS_Resource/"+request.getParameter("addProjectId");//檔案儲存路徑

前臺介面程式碼

  • HTML:
<form id="addResourceForm" method="post" class="form-horizontal">

                        <div class="form-group">
                            <label for="constantTypeName" class="col-sm-3 control-label">所屬專案編號</label>
                              <select class="form-control" id="addProjectId"
                            name="addProjectId">
                               </select>
                            <!-- <div class="col-sm-9">
                                <input type="text" class="form-control" id="addProjectId"
                                    name="addProjectId" readonly>
                            </div> -->
                        </div>
                        <div class="form-group">
                            <label for="constantTypeName" class="col-sm-3 control-label">資源名稱</label>

                            <div class="col-sm-9">
                                <input type="text" class="form-control" id="addResourceName"
                                    name="addResourceName">
                            </div>
                        </div>

                        <div class="form-group">
                            <label for="constantTypeName" class="col-sm-3 control-label">資源上傳</label>
                            <div class="col-sm-9">
                                <input type="file" class="form-control" id="addUploadFile" name="addUploadFile" onchange="checkResourceSize(this)">
                            </div>
                        </div>

                        <div class="form-group">
                            <label for="constantTypeName" class="col-sm-3 control-label">資源簡介</label>
                            <div class="col-sm-9">
                                <textarea  class="form-control" id="addResourceBrief"
                                    name="addResourceBrief"></textarea>
                            </div>
                        </div>

                        <div class="form-group">
                            <div class="col-sm-4 col-sm-offset-8" style="text-align: right">
                                <button type="button" id="saveResourceBtn"
                                    class="btn btn-primary" onclick="addResource()">儲存</button>
                                <button type="button" class="btn btn-default"
                                    data-dismiss="modal">關閉</button>
                            </div>
                        </div>

                        <div id="modalResourceTip"></div>
                    </form>
  • js程式碼:
function addResource() {

    if($('#addResourceName').val()==''){
            $("#modalResourceTip").append("<div id=\"resourceAlert\" class=\"alert alert-danger\"><a href=\"#\" class=\"close\" data-dismiss=\"alert\">&times;</a>資源名不能為空</div>");
             setTimeout(function(){
                   $("#resourceAlert").remove()         
               },2000);
             return false;  
        }

    if( $('#addUploadFile').val().trim() ==""){
            $("#modalResourceTip").append("<div id=\"resourceAlert\" class=\"alert alert-danger\"><a href=\"#\" class=\"close\" data-dismiss=\"alert\">&times;</a>請選擇上傳需要上傳的資料</div>");
             setTimeout(function(){
                   $("#resourceAlert").remove()         
               },2000);
             return false;  
        }

        if( $('#addResourceBrief').val().trim() ==""){
            $("#modalResourceTip").append("<div id=\"resourceAlert\" class=\"alert alert-danger\"><a href=\"#\" class=\"close\" data-dismiss=\"alert\">&times;</a>請填寫資源簡介</div>");
             setTimeout(function(){
                   $("#resourceAlert").remove()         
               },2000);
             return false;  
        }


    $("#addResourceForm").ajaxSubmit({
          url: "../../resource/upLoadFile",
          type: "post",
          enctype: 'multipart/form-data',
          // iframe: true,
          dataType:'json',
          success: function (data)
          {
              if(data.status=="2000"){
                  $("#addResourceModal").modal('hide');//顯示form模態框

                  getData(1, 10);//重新載入資料
              }else{
                  $("#modalResourceTip").append("<div id=\"resourceAlert\" class=\"alert alert-danger\"><a href=\"#\" class=\"close\" data-dismiss=\"alert\">&times;</a>上傳資源失敗了,"+data.errorMessage+"</div>");
                 setTimeout(function(){
                    $("#resourceAlert").remove();       
                   },2000);
              }

          },
          error: function (data)
          {


              $("#modalResourceTip").append("<div id=\"resourceAlert\" class=\"alert alert-danger\"><a href=\"#\" class=\"close\" data-dismiss=\"alert\">&times;</a>上傳資源失敗了,伺服器出現了問題,請稍後重試</div>");
             setTimeout(function(){
                   $("#resourceAlert").remove();        
               },2000);
          }
        })

}

/**
* 檢查檔案大小
* @param ele
* @returns
*/
function checkResourceSize(ele){

if((ele.files[0].size / 1024/1024).toFixed(2)>30){

        $("#saveResourceBtn").attr("disabled","disabled");
        $("#modalResourceTip").append("<div id=\"resourceAlert\" class=\"alert alert-danger\"><a href=\"#\" class=\"close\" data-dismiss=\"alert\">&times;</a>上傳檔案的大小不能超過30M</div>");

         return false;  

    }else{
        $("#saveResourceBtn").removeAttr("disabled");//將按鈕可用   
        setTimeout(function(){
               $("#resourceAlert").remove()         
           },1000);
    }

}

這樣上傳檔案就完成了!!

演示圖片:

這裡寫圖片描述
就上傳到指定的路徑下了
這裡寫圖片描述

下載

Java後臺:

/**
     * 下載
     * @param request
     * @param response
     * @return
     * @throws Exception
     */
    @RequestMapping("downLoad")
    @ResponseBody
    public ResponseEntity downLoad(HttpServletRequest  request,HttpServletResponse response) throws Exception{
           FileInputStream fis =null;
           BufferedInputStream bis =null;
        try { 
            //通過資源ID獲取實體類
          Resource retResource=resourceService.findResourceById(Integer.parseInt(request.getParameter("resourceId")));

          File file = new File(retResource.getResourceAddress());
          String path=retResource.getResourceAddress();//獲取檔案路徑
          String fileName=path.substring(path.lastIndexOf("\\")+1);//擷取檔名
          if(file.exists())
          {
           response.setContentType("application/octet-stream");
           response.addHeader("Content-Disposition","attachment;filename="+new String(fileName.getBytes("utf-8"),"iso-8859-1"));
           response.setHeader("Content-Length", String.valueOf(file.length()));
           byte[] buffer = new byte[1024];
            fis = new FileInputStream(file);
            bis = new BufferedInputStream(fis);
            OutputStream os =response.getOutputStream();
            int i =bis.read(buffer);
            while (i!=-1) {
             os.write(buffer, 0, i);
             i=bis.read(buffer);
            }
          }  else{
              return ResponseEntity.status(ResponseVoConstant.BADREQUEST).
                        data(null).errorMessage(MessageUtil.getMessageValue("DOWNLOAD_FIAL"));   
          }
           } catch (Exception e) {

              return ResponseEntity.status(ResponseVoConstant.BADREQUEST).
                        data(null).errorMessage(MessageUtil.getMessageValue("DOWNLOAD_FIAL"));      
           }finally {
             bis.close();
             fis.close();
           }
            return ResponseEntity.status(ResponseVoConstant.OK).
                    data(null).errorMessage(MessageUtil.getMessageValue("DOWNLOAD_SUCCESS"));   
  }
    /**
     * 通過資源ID檢查檔案是否存在
     * @param resource
     * @param request
     * @return
     * @throws Exception 
     */
    @RequestMapping("checkFileByResourceId")
    @ResponseBody
    public ResponseEntity checkFileByResourceId(@RequestBody Resource resource,HttpServletRequest request) throws Exception{
        Resource retResource=resourceService.findResourceById(resource.getResourceId());
        File file = new File(retResource.getResourceAddress());
          if(file.exists()){//判斷檔案是否存在
            return ResponseEntity.status(ResponseVoConstant.OK).
                        data(null).errorMessage(MessageUtil.getMessageValue("FILE_EXIST"));  
          }
          else {
            return ResponseEntity.status(ResponseVoConstant.BADREQUEST).
                        data(null).errorMessage(MessageUtil.getMessageValue("FILE_NO_EXIST"));  
        }

    }

前臺程式碼

  • HTML
    <form id="updateResourceForm" method="post" class="form-horizontal">



                        <div id="downloadResourceTip"></div>
                        <div class="form-group">
                            <div class="col-sm-4 col-sm-offset-8" style="text-align: right">
                                <button type="button" id="downloadResourceBtn"
                                    class="btn btn-primary" onclick="">下載</button>
                                <button type="button" class="btn btn-default"
                                    data-dismiss="modal">關閉</button>
                            </div>
                        </div>


                    </form>
  • js程式碼
/**
* 下載資源
* @param resourceId
* @returns
*/
function downloadResource(resourceId) {

  $("#downloadForm").remove();//移除之前下載時產生的form,防止冗餘
  var form=$("<form id='downloadForm'>");//定義一個form表單  
  form.attr("style","display:none");  
  form.attr("target","");  
  form.attr("method","post");  
  form.attr("action","../../resource/downLoad");  
  var inputResourceId=$("<input>");  
  inputResourceId.attr("type","text");  
  inputResourceId.attr("name","resourceId");  
  inputResourceId.attr("value",resourceId);  
  $("body").append(form);//將表單放置在web中  
  form.append(inputResourceId);  
  form.submit();//表單提交   
}

//確認資源能否下載

function  checkResourceStatus(resourceId) {

    $("#downloadResourceAlert").remove();
    $("#downloadResourceBtn").removeAttr("disabled");//將按鈕可用 
    $("#downloadResourceBtn").removeAttr("onclick");//移除下載事件

    $.ajax({
        url : '../../resource/checkFileByResourceId', 
        type: "POST",
        contentType:'application/json',
        data : JSON.stringify({
            "resourceId":resourceId


        }),
        success : function(result) {
            if(result.status=="2000"){

                 $("#downloadResourceTip").append("<div id=\"downloadResourceAlert\" class=\"alert alert-success\"><a href=\"#\" class=\"close\" data-dismiss=\"alert\">&times;</a>資源正常,可以正常下載</div>");
                 $("#downloadResourceBtn").attr("onclick","downloadResource("+resourceId+")");
            }else{
                 $("#downloadResourceTip").append("<div id=\"downloadResourceAlert\" class=\"alert alert-danger\"><a href=\"#\" class=\"close\" data-dismiss=\"alert\">&times;</a>"+result.errorMessage+"</div>"); 
                 $("#downloadResourceBtn").attr("disabled","disabled");
            }


        },
        error : function() {

             $("#downloadResourceTip").append("<div id=\"downloadResourceAlert\" class=\"alert alert-danger\"><a href=\"#\" class=\"close\" data-dismiss=\"alert\">&times;</a>伺服器出現了問題,暫時無法下載,請稍後重試</div>");   
             $("#downloadResourceBtn").attr("disabled","disabled");
        }
    });

這樣下載就完成了,可以把剛剛上傳的檔案下載下來:

演示

這裡寫圖片描述