Java实现下载文件的六种方法详解

佳德_Boy 2024-12-24 09:50:19编程技术
344

在现代Web开发中,文件下载是一个常见的需求。无论是用户上传的文件、系统生成的报告还是从网络获取的数据,都需要一种高效且可靠的方法来实现文件的下载。本文将详细介绍使用Java实现文件下载的六种方法,包括以流的方式下载、下载本地文件、下载网络文件、在线打开文件、将文件转换成Base64以及将MultipartFile转换为File。每种方法都通过示例代码进行了详细说明,旨在为开发者提供全面的参考。

java.webp

一、以流的方式下载

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

二、下载本地文件

public void downloadLocal(HttpServletResponse response) throws FileNotFoundException {
        // 下载本地文件
        String fileName = "Operator.doc".toString(); // 文件的默认保存名
        // 读到流中
        InputStream inStream = new FileInputStream("c:/Operator.doc");// 文件的存放路径
        // 设置输出的格式
        response.reset();
        response.setContentType("bin");
        response.addHeader("Content-Disposition", "attachment; filename=\"" + fileName + "\"");
        // 循环取出流中的数据
        byte[] b = new byte[100];
        int len;
        try {
            while ((len = inStream.read(b)) > 0)
                response.getOutputStream().write(b, 0, len);
            inStream.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

三、下载网络文件

public void downloadNet(HttpServletResponse response) throws MalformedURLException {
        // 下载网络文件
        int bytesum = 0;
        int byteread = 0;
        URL url = new URL("windine.blogdriver.com/logo.gif");
        try {
            URLConnection conn = url.openConnection();
            InputStream inStream = conn.getInputStream();
            FileOutputStream fs = new FileOutputStream("c:/abc.gif");
            byte[] buffer = new byte[1204];
            int length;
            while ((byteread = inStream.read(buffer)) != -1) {
                bytesum += byteread;
                System.out.println(bytesum);
                fs.write(buffer, 0, byteread);
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
public void downLoadFile(HttpServletResponse response, String httpUrl) {
        ServletOutputStream out = null;
        try {
            //与服务器建立连接
            URL url = new URL(httpUrl);
            URLConnection conn = url.openConnection();
            InputStream inputStream = conn.getInputStream();
            try {
                //1.设置文件ContentType类型,这样设置,会自动判断下载文件类型
                response.setContentType("multipart/form-data");
            } catch (Exception e){
                e.printStackTrace();
            }
            out = response.getOutputStream();
            // 读取文件流
            int len = 0;
            byte[] buffer = new byte[1024 * 10];
            while ((len = inputStream.read(buffer)) != -1) {
                out.write(buffer, 0, len);
            }
            out.flush();
            out.close();
            inputStream.close();
        } catch (Exception e){
            e.printStackTrace();
        }
    }

四、在线打开的方式

public void downLoad(String filePath, HttpServletResponse response, boolean isOnLine) throws Exception {
        File f = new File(filePath);
        if (!f.exists()) {
            response.sendError(404, "File not found!");
            return;
        }
        BufferedInputStream br = new BufferedInputStream(new FileInputStream(f));
        byte[] buf = new byte[1024];
        int len = 0;
        response.reset(); // 非常重要
        if (isOnLine) { // 在线打开方式
            URL u = new URL("file:///" + filePath);
            response.setContentType(u.openConnection().getContentType());
            response.setHeader("Content-Disposition", "inline; filename=" + f.getName());
            // 文件名应该编码成UTF-8
        } else { // 纯下载方式
            response.setContentType("application/x-msdownload");
            response.setHeader("Content-Disposition", "attachment; filename=" + f.getName());
        }
        OutputStream out = response.getOutputStream();
        while ((len = br.read(buf)) > 0)
            out.write(buf, 0, len);
        br.close();
        out.close();
    }

五、将文件转换成base64

    /**
     * 将文件转为base64
     */
    public static String getBase64FromFile(File file) throws IOException {
        FileInputStream in = null;
        ByteArrayOutputStream out = null;
        try {
            in = new FileInputStream(file);
            out = new ByteArrayOutputStream();
            int read = 0;
            byte[] buffer = new byte[1024];
            while ((read = in.read(buffer, 0, 1024)) != -1) {
                out.write(buffer, 0, read);
            }
            return Base64.getEncoder().encodeToString(out.toByteArray());
        } catch (IOException e) {
            throw e;
        } finally {
            if (in != null) {
                in.close();
            }
            if (out != null){
                out.close();
            }
        }
    }

六、将MultipartFile转换为File

    /**
     * 将MultipartFile转换为File
     */
    public static File MultipartFileToFile(MultipartFile multiFile) throws IOException {
        String fileName = multiFile.getOriginalFilename();
        String prefix = fileName.substring(fileName.lastIndexOf("."));
        InputStream in = null;
        OutputStream out = null;
        try {
            File file = File.createTempFile(fileName, prefix);
            out = new FileOutputStream(file);
            in = multiFile.getInputStream();
            int read = 0;
            byte[] buffer = new byte[1024];
            while ((read = in.read(buffer, 0, 1024)) != -1) {
                out.write(buffer, 0, read);
            }
            return file;
        } catch (Exception e) {
            throw e;
        }finally {
            if (in != null){
                in.close();
            }
            if (out != null){
                out.close();
            }
        }
    }

总结

本文详细介绍了Java实现文件下载的六种方法,每种方法都有其特定的应用场景和优势。通过使用InputStream和OutputStream,可以灵活地处理各种文件下载需求。下载本地文件和网络文件的方法适用于不同来源的文件。在线打开文件的功能则提供了更多的灵活性,支持用户直接查看文件内容。将文件转换成Base64编码字符串和将MultipartFile转换为File的方法则在特定场景下非常有用。这些方法不仅能够满足基本的文件下载需求,还能应对更复杂的业务场景,为开发者提供了丰富的选择。希望本文的内容对读者在实际项目中实现文件下载功能有所帮助。

Java 下载文件 文件下载
THE END
蜜芽
故事不长,也不难讲,四字概括,毫无意义。

相关推荐

Java中的排序机制:Comparable与Comparator接口区别解析
Java语言提供了两种主要的排序机制:Comparable接口和Comparator接口。这两种机制虽然都能实现排序功能,但它们在实现方式、应用场景和灵活性上存在显著差异。本文将深入解析...
2025-02-13 编程技术
172

DeepSeek集成IntelliJ IDEA:提升Java编程效率
DeepSeek,作为一款专为开发者设计的高性能、智能化人工智能工具,其与IntelliJ IDEA(IDEA)的集成无疑为Java开发者带来了前所未有的编程体验。本文将详细介绍如何将DeepSeek集...
2025-02-10 编程技术
199

JavaScript中forEach的几种用法详解
在处理数组时,JavaScript 提供了许多内置方法,其中 forEach 是最常用的方法之一。forEach 方法为数组中的每个元素执行一次提供的函数,使得遍历数组变得简单而高效。本文将...
2025-01-17 编程技术
224

Java中UUID五个版本的区别及使用场景详解
在现代软件开发中,生成唯一标识符是一个常见的需求,尤其是在分布式系统和多用户环境中。Java提供了java.util.UUID类,支持五种不同版本的UUID(Universally Unique Identifi...
2025-01-16 编程技术
232

Java 中 UUID 和 雪花算法的生成及应用场景详解
在分布式系统和大规模应用中,唯一标识符的生成是一个至关重要的问题。Java 提供了多种生成唯一标识符的方法,其中UUID(Universally Unique Identifier)和雪花算法(Snowflake...
2025-01-16 编程技术
247

Vue中实现文件下载的6种方法详解
​在现代Web开发中,文件下载是一个常见的需求。Vue.js作为一款流行的前端框架,提供了多种实现文件下载的方法。本文将详细介绍6种在Vue项目中实现文件下载的常用方法,每种方...
2025-01-14 编程技术
317