Spring MVC 实现本地文件的上传和下载

博客介绍了使用SpringMVC实现文件上传与下载的方法。前台可通过特定方法提交表单,在不刷新不跳转页面的状态下完成操作。后台使用SpringMVC处理文件上传保存和下载,上传文件可保存到本地或文件服务器,下载需前台提供文件id查询信息。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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;
    }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值