javaweb基于spring MVC的上传下载实例(下)

本文介绍了一个文件下载功能的具体实现步骤,包括前端页面展示、后端控制器处理及服务层逻辑实现等,通过Spring MVC框架实现文件的展示与下载。

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

文件下载

  要将Web应用系统中的文件资源提供给用户进行下载,首先我们要有一个页面列出上传文件目录下的所有文件,当用户点击文件下载超链接时就进行下载操作,编写一个ListFileServlet,用于列出Web应用系统中所有下载文件。

1.1 搭建前台页面
download.html代码如下:

<!DOCTYPE HTML>
<html>
<head> <title>下载文件显示页面</title></head> 
<body>
    <div id="fileName"></div>
</body>
</html>

对download.html添加js:

<script >
<!-- 初始化加载download()函数 -->
$(function(){
    download();
}); 
function download(){  
 $.ajax({
     url: 'cloud/load/download', 
     type: 'POST',   
     dataType:'JSON',
     cache: false,  
     processData: false,  
     contentType: false,
     success : function(date){
       var file="";
       $.each(date,function(key,values){
         var newKey = "/D:/Download/"+key;
         file += "<div>"+key+"&nbsp;&nbsp;"+"<a href='cloud/load/downloadFile?fileName="+key+"'>"+"下载"+"</a>"+"</div>"+"<br>";
         $(values).each(function(){
           file+="\t"+this; 
         }); 

       });
       alert("success"); 
      },  
      error : function(e){
        alert("error");
      }
      });
  }
</script>

说明:
在spring mvc框架下,通过spring注解,这里的ajax的url指向的是UploadAndDownloadController的download()方法

1.2 controller
UploadAndDownloadController.Java代码如下:

 package com.cloud.web.controller;

import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

import javax.annotation.Resource;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;

import com.cloud.web.service.FileLoadService;

@Controller
@RequestMapping("/load")
public class UploadAndDownloadController {

    @Resource
    public FileLoadService fileLoadService;

    /**
     * 显示要下载的文件
     * @param request
     * @param response
     * @param model
     * @return
     * @throws ServletException
     * @throws IOException
     */
    @RequestMapping(value = "/download", method = RequestMethod.POST)
    @ResponseBody
    public Map<String,String> download(HttpServletRequest request, HttpServletResponse response,  ModelMap model) throws ServletException,  IOException{
      Map<String,String> map = fileLoadService.doGet(request, response);
      return map;
    }

    /**
     * 文件下载到本地
     * @param request
     * @param response
     * @param model
     * @throws ServletException
     * @throws IOException
     */
    @RequestMapping(value = "/downloadFile", method = RequestMethod.GET)
    @ResponseBody
    public void downloadFile(HttpServletRequest request, HttpServletResponse response,  ModelMap model) throws ServletException,  IOException{
      String filename =request.getParameter("fileName");
      fileLoadService.doGetFile(request, response ,filename);
    }

}

1.3 service接口
FileLoadService程序如下:

package com.cloud.web.service;

import java.io.File;
import java.io.IOException;
import java.util.Map;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public interface FileLoadService {
    Map<String,String> doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException;

    void listfile(File file,Map<String,String> map);

    void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException;

    void  doGetFile(HttpServletRequest request, HttpServletResponse response,String filename) throws ServletException, IOException;


}

1.4 service的实现类
FileLoadServiceImpl.java程序如下:

package com.cloud.web.service.impl;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URLEncoder;
import java.util.HashMap;
import java.util.Map;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.stereotype.Service;

import com.cloud.web.service.FileLoadService;

@Service
public class FileLoadServiceImpl implements FileLoadService{

    /**
     * 待下载文件的显示
     */
    @Override
    public Map<String,String> doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{

        //获取上传文件的目录
        String uploadFilePath = "/D:/Download/";
        //存储要下载的文件名
        Map<String,String> fileNameMap = new HashMap<String,String>();
        //递归遍历uploadFilePath目录下的所有文件和目录,将文件的文件名存储到map集合中
        listfile(new File(uploadFilePath),fileNameMap);//File既可以代表一个文件也可以代表一个目录
        //将Map集合返回页面
        return fileNameMap;
    }    

     public void listfile(File file,Map<String,String> map){
        //如果file代表的不是一个文件,而是一个目录
        if(!file.isFile()){
        //列出该目录下的所有文件和目录
        File files[] = file.listFiles();
        //遍历files[]数组
        for(File f : files){
        //递归
         listfile(f,map);
         }
    }else{
            String realName = file.getName().substring(file.getName().indexOf("_")+1);
            //file.getName()得到的是文件的原始名称,这个名称是唯一的,因此可以作为key,realName是处理过后的名称,有可能会重复
            map.put(file.getName(), realName);
        }
    }

    public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }

        /**
         * 将显示的文件下载到本地
         */
        @Override
        public void doGetFile(HttpServletRequest request, HttpServletResponse response,String filename) throws ServletException,IOException {
            //得到要下载的文件名
             String fileName = filename;
             //解决乱码问题
             fileName = new String(fileName.getBytes("iso8859-1"),"UTF-8");
             String fileSaveRootPath="/D:/Download";
             //文件路径
             File file = new File(fileSaveRootPath + "/" + fileName);
             //如果文件不存在
             if(!file.exists()){
                 request.setAttribute("message", "您要下载的资源已被删除!!");
                 return;
             }
            //处理文件名
            String realname = fileName.substring(fileName.indexOf("_")+1);
            //设置响应头,控制浏览器下载该文件
            response.setHeader("content-disposition", "attachment;filename=" + URLEncoder.encode(realname, "UTF-8"));
            InputStream fis = new BufferedInputStream(new FileInputStream(fileSaveRootPath + "\\" + fileName));
            byte[] buffer = new byte[fis.available()]; 
            fis.read(buffer);  //读取文件流
            fis.close();//关闭文件流
            response.reset();//重置结果集
            response.setHeader("content-disposition", "attachment;filename=" + URLEncoder.encode(realname, "UTF-8"));
            response.addHeader("Content-Length", "" + file.length());  //返回头 文件大小
            response.setContentType("application/octet-stream");    //设置数据种类
            ///获取返回体输出权
            OutputStream os = new BufferedOutputStream(response.getOutputStream());  
            os.write(buffer); // 输出文件
            os.flush();
            os.close();

        }


          public void doPostFile(HttpServletRequest request, HttpServletResponse response,String filename)throws ServletException, IOException {
               doGetFile(request, response,filename);
           }
}

以上 文件下载完成~

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值