java下载文件

package com.yangche.utils;

import javax.servlet.http.HttpServletResponse;
import java.io.*;

public class UploadDownUtil {
    /**
     *文件下载
     * @param path
     * @param response
     * @return
     */
    public static HttpServletResponse download(String path, HttpServletResponse response) {
        try {
            // path是指欲下载的文件的路径。
            File file = new File(path);
            // 取得文件名。
            String filename = file.getName();
            // 取得文件的后缀名。
            String ext = filename.substring(filename.lastIndexOf(".") + 1).toUpperCase();

            // 以流的形式下载文件。
            InputStream fis = new BufferedInputStream(new FileInputStream(path));
            byte[] buffer = new byte[fis.available()];
            fis.read(buffer);
            fis.close();
            // 清空response
            response.reset();
            // 设置response的Header
            response.addHeader("Content-Disposition", "attachment;filename=" + new String(filename.getBytes()));
            response.addHeader("Content-Length", "" + file.length());
            OutputStream toClient = new BufferedOutputStream(response.getOutputStream());
            response.setContentType("application/octet-stream");
            toClient.write(buffer);
            toClient.flush();
            toClient.close();
        } catch (IOException ex) {
            ex.printStackTrace();
        }
        return response;
    }
}

 

maven依赖(可能会和tomcat自带的冲突,看情况,如果没有这个依赖再添加)

<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>javax.servlet-api</artifactId>
    <version>3.1.0</version>
</dependency>

 

controller层的代码(前端直接访问这个方法即可直接下载对应的文件!可以自己拿浏览器访问试试)

package com.yangche.controller;

import com.yangche.utils.UploadDownUtil;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.net.URL;

@Controller
public class FileController {

    @RequestMapping(path="/api/file/download")
    @ResponseBody
    public void fileDownload(HttpServletRequest request, HttpServletResponse response){
        URL xmlpath = this.getClass().getClassLoader().getResource("file/123.xlsx"); //通过这种方式获得文件的路径
        String path = xmlpath.getPath();
        UploadDownUtil.download(path, response);
    }
}

如图:我把前端要下载的文件放到了这个目录下

注意:有时候把文件放到自己的项目中下载后打不开,我的项目就是这种情况,一个excel打不开,但是如果文件不在项目中,直接引用电脑上的文件,就是可以打开的,目前不清楚是什么原因导致的,望不吝赐教。

 

posted @ 2019-01-18 19:31  无畏D尘埃  阅读(1304)  评论(0编辑  收藏  举报