Java后端文件下载

这篇博客介绍了如何在Java后端实现文件下载功能。通过`@RequestMapping`和`@GetMapping`注解定义了两个不同的下载方法,分别处理不同情况的文件下载。内容包括读取文件,设置响应头,处理文件名编码问题,以及使用`BufferedInputStream`和`OutputStream`进行文件内容的传输。

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

@RequestMapping("/filedown1/{id}")
    public void down(@PathVariable String id, HttpServletResponse response) throws Exception {
        BudgetAttendance bugdet = new BudgetAttendance();
        try {
            bugdet = budgetAndAttendanceManageService.findBudgetById(new Long(id));
        } catch (Exception e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }
        String fileName = bugdet.getFileName();
        String filePath = bugdet.getFilePath();
        String[] split = fileName.split("\\.");
        int suffixIndex = split.length - 1;
        String enctype = new String(split[suffixIndex].getBytes(), "ISO8859-1");
        File file = realFile(fileName, filePath);
        String fileCnName = new String(file.getName().getBytes("utf-8"), "iso8859-1");
        // 设置输出的格式
        response.reset();
        response.setContentType("\"" + enctype + "\"");
        //filename前端取22个字符不变
        response.setHeader("Content-Disposition", "attachment; filename=\"" + fileCnName + "\"");
        // 必须设置响应内容大小
        response.addHeader("Content-Length", String.valueOf(file.length()));

        byte[] buffer = new byte[1024];
        BufferedInputStream bis = null;
        try {
            bis = new BufferedInputStream(new FileInputStream(file));
            OutputStream os = response.getOutputStream();
            int i;
            while ((i = bis.read(buffer)) != -1) {
                os.write(buffer, 0, i);
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            //一定要关闭文件流。并且关闭文件流必须放在finally里面
            if (bis != null) {
                try {
                    bis.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

@GetMapping("/download")
    @ResponseBody
    public void download(HttpServletResponse response, @RequestParam(name = "fileName") String fileName,
                         @RequestParam(name = "filePath") String filePath)
            throws Exception {
        //File zipFile = zipFiles(fileName, filePath);
        File zipFile = realFile(fileName, filePath);
        String fileCnName = new String(zipFile.getName().getBytes("utf-8"), "iso8859-1");
        response.setHeader("Content-Disposition", "attachment;filename=" + fileCnName);
        response.setContentType("application/force-download");

        byte[] buffer = new byte[1024];

        FileInputStream fis = new FileInputStream(zipFile);
        BufferedInputStream 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);
        }
        bis.close();
        fis.close();

        //zipFile.delete();
    }

    private File realFile(String fileName, String filePath) throws Exception {

        File realFile = new File(filePath);
        File showFile = new File(fileName);

        InputStream fis = null;
        OutputStream fos = null;

        byte[] bt = new byte[1024];

        try {
            fis = new FileInputStream(realFile);
            fos = new FileOutputStream(showFile);

            int read = 0;
            while ((read = fis.read(bt)) > 0) {
                fos.write(bt, 0, read);
            }
        } catch (Exception e) {
            throw new RuntimeException("文件下载异常");
        } finally {
            fis.close();
            fos.close();
        }

        return showFile;
    }

    private File zipFiles(String fileName, String filePath) throws Exception {

        List<File> files = new LinkedList<>();

        File realFile = new File(filePath);
        File showFile = new File(fileName);

        InputStream fis = null;
        OutputStream fos = null;

        byte[] bt = new byte[1024];

        try {
            fis = new FileInputStream(realFile);
            fos = new FileOutputStream(showFile);

            int read = 0;
            while ((read = fis.read(bt)) > 0) {
                fos.write(bt, 0, read);
            }
        } catch (Exception e) {
            throw new RuntimeException("文件下载异常");
        } finally {
            fis.close();
            fos.close();
        }

        files.add(showFile);

        String zipName = UUID.randomUUID().toString() + ".zip";

        return FilesUtils.zipFiles(files, getUploadPath(), zipName);
    }
 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值