Spring MVC 實現本地文件的上傳和下載

1、前臺

前臺可以使用$("#form").ajaxSubmit(function(result) {})方法提交表單,如下方式可以在當前頁面不刷新不跳轉的的狀態下完成表單的提交。

//保存內容
function submitForm() {
	if(confirm("是否確認辦理延期申請?")) {
		if(save()){
			var url=webCfg.servePath + "/dcdbDelay/saveUpload";
			$("#form").attr("enctype","multipart/form-data");
			$("#form").attr("action",url);
			//$("#form").attr("target","nm_iframe");
			//$("#form").submit();
			//alert("保存成功");
		  
			// jquery 表單提交
			$("#form").ajaxSubmit(function(result) {
				var data = $.parseJSON(result);
			    // 對於表單提交成功後處理,message爲表單正常提交後返回的內容
				if (data.status === true) {   		
					alert("保存成功!");
					$('#basis').css("color","black");
					$('#delayDate').css("color","black");
				}else{
					alert(data.msg);
				}
			});
		}
	}
	    return false; // 必須返回false,否則表單會自己再做一次提交操作,並且頁面跳轉	
}

 

2、後臺

後臺以SpringMVC處理文件的上傳保存和下載。此處示例文件上傳後保存在本地,實際項目中需要把文件保存到文件服務器上。

2.1 文件上傳保存

/**
     * 保存上傳文件信息
     * @param model
     * @param request
     * @param file
     * @return
     * @throws IOException
     * @throws ParseException
     */
    @RequestMapping(value = "/saveUpload", method = RequestMethod.POST)
    @ResponseBody
    public Object saveUpload(@RequestParam("file") MultipartFile file, HttpServletRequest request,
            HttpServletResponse response) throws IOException, ParseException {
        response.setContentType("text/html;charset=utf-8");
        //獲取前臺參數
        String taskSubId = request.getParameter("taskSubId");
        String delayId = request.getParameter("delayId");
        JSONObject result = new JSONObject();
        String fileName = file.getOriginalFilename();
        fileId = UUID.randomUUID().toString();
        if (fileName != null && !"".equals(fileName)) {
            InputStream iso = file.getInputStream();
            SaveFileFromInputStream(iso, "", fileName);
        }

        //保存信息至數據庫(delayAO是實體類)
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        DcdbTaskDelayAO delayAO = new DcdbTaskDelayAO();
        delayAO.setId(delayId);
        delayAO.setDcdbSubTaskId(taskSubId);
        delayAO.setFileName(fileName );
        delayAO.setFilePath("D:\\" + fileName);
        delayAO.setFileId(fileId);
        ServiceResult<Boolean> saveResult = dcdbTaskDelayService.saveOrUpdate(delayAO);
        if (saveResult != null && saveResult.getData() == true) {
            result.put("status", true);
            result.put("msg", "保存成功");
        } else {
            result.put("status", false);
            result.put("msg", "保存失敗!");
        }
        return retString(result);
    }
//保存上傳的附件至服務器
    public void SaveFileFromInputStream(InputStream is, String path, String filename) throws IOException {
        FileOutputStream fs = new FileOutputStream(path + "D:\\" + filename);
        byte[] buffer = new byte[1024 * 1024];
        int bytesum = 0;
        int byteread = 0;
        while ((byteread = is.read(buffer)) != -1) {
            bytesum += byteread;
            fs.write(buffer, 0, byteread);
            fs.flush();
        }
        fs.close();
        is.close();
    }

    //JASON對象格式化
    private Object retString(JSONObject result) {
        String jsoStr = "";
        try {
            jsoStr = JSON.json(result);
        } catch (IOException e) {
            e.printStackTrace();
            return jsoStr;
        }
        return jsoStr;
    }

2.2文件的下載

文件的下載需要在前臺提供一個可供使用的文件id,用於去數據庫查詢文件信息後下載。

/**
     * 下載文件
     * @param request
     * @param filename
     * @param filePath
     * @param model
     * @return
     * @throws Exception
     */
    @RequestMapping(value = "/download", method = RequestMethod.GET)
    public ResponseEntity<byte[]> downloadFile(HttpServletRequest request, @RequestParam("delayId") String delayId,
            Model model) throws Exception {
        ServiceResult<DcdbTaskDelayAO> saveResult = dcdbTaskDelayService.getById(delayId);
        String filePath = saveResult.getData().getFilePath();
        int startIndex = filePath.lastIndexOf("\\");
        String filename = filePath.substring(startIndex + 1);
        //下載文件路徑
        File file = new File(filePath + File.separator);
        HttpHeaders headers = new HttpHeaders();
        //下載顯示的文件名,解決中文名稱亂碼問題  
        String downloadFielName = setFileName(request, filename);
        //通知瀏覽器以attachment(下載方式)打開圖片
        headers.setContentDispositionFormData("attachment", downloadFielName);
        //application/octet-stream : 二進制流數據(最常見的文件下載)。
        headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
        return new ResponseEntity<byte[]>(FileUtils.readFileToByteArray(file), headers, HttpStatus.OK);
    }



/**
     * 處理下載文件名編碼問題;
     * @param request
     * @param response
     * @param name
     * @throws UnsupportedEncodingException
     */
    public String setFileName(HttpServletRequest request, String fileName) throws UnsupportedEncodingException {
        String agent = request.getHeader("USER-AGENT");
        if (null != agent && -1 != agent.indexOf("MSIE") || null != agent && -1 != agent.indexOf("Trident")) {// IE
            fileName = java.net.URLEncoder.encode(fileName, "UTF8");

        } else if (null != agent && -1 != agent.indexOf("Mozilla")) {// 火狐,chrome等
            fileName = new String(fileName.getBytes("UTF-8"), "iso-8859-1");
        }
        return fileName;
    }

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章