java代码实现使用网络地址下载文件

简介: java代码实现使用网络地址下载文件
加哥今天给大家分享一个使用java代码实现用网络url实现文件的下载方法,在平时的学习或者开发中有人总会需要给你一个地址让你调用java代码实现文件的下载。话不多说,直接给大家上代码。
下面的代码是一个Controller层的方法,在方法上我们定义了请求路径,请求时候需要传递的参数。不论是图片、压缩文件包、word文档、pdf文档、excel表格文件等都可以实现下载,只要网路地址传输没问题。
package com.sunwayland.quartz;
import io.swagger.annotations.ApiParam;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.net.HttpURLConnection;
import java.net.URL;
import java.nio.charset.StandardCharsets;
@Slf4j
@Controller("test")
public class Download {
    @RequestMapping("checkDownload")
    public void checkDownload(@ApiParam("文件地址") @RequestParam("url") String url,
                              HttpServletResponse response) throws Exception {
        HttpURLConnection conn = null;
        InputStream fis = null;
        try {
            File file = new File(url);
            // 取得文件的后缀名。
            String ext = file.getName().substring(file.getName().lastIndexOf(".") + 1).toLowerCase();
            StringBuffer buffername = new StringBuffer(url.substring(url.lastIndexOf("/")+1));
            // 取的文件名
            String filename = buffername.toString();
            URL path = new URL(url);
            conn = (HttpURLConnection) path.openConnection();
            conn.setRequestMethod("GET");
            conn.setConnectTimeout(5 * 1000);
            // 通过输入流获取数据
            fis = conn.getInputStream();
            byte[] buffer = readInputStream(fis);
            if (null != buffer && buffer.length > 0) {
                // 清空response
                response.reset();
                // 设置response的Header
                response.addHeader("Content-Disposition", "attachment;filename=" + new String(filename.getBytes(StandardCharsets.UTF_8), StandardCharsets.ISO_8859_1));
                response.addHeader("Content-Length", "" + buffer.length);
                OutputStream toClient = response.getOutputStream();
                //response.setContentType("application/x-msdownload");
                response.setContentType("application/octet-stream");
                toClient.write(buffer);
                toClient.flush();
                toClient.close();
            }
        } catch (IOException ex) {
            log.error("下载文件异常:", ex);
            throw new Exception("下载异常,请稍后再试。");
        } finally {
            if (conn != null) {
                conn.disconnect();
            }
            if (fis != null) {
                try {
                    fis.close();
                } catch (IOException ioe) {
                    log.error("下载文件->关闭流异常:", ioe);
                }
            }
        }
    }
    /**
     * 从输入流中获取数据
     *
     * @param fis : InputStream
     * @return byte[]
     * @author chenp
     * @date 2023/3/28 11:31
     */
    private byte[] readInputStream(InputStream fis) throws IOException {
        ByteArrayOutputStream outStream = new ByteArrayOutputStream();
        byte[] buffer = new byte[1024];
        int len = 0;
        while ((len = fis.read(buffer)) != -1) {
            outStream.write(buffer, 0, len);
        }
        fis.close();
        return outStream.toByteArray();
    }
}
注意:大家在测试的过程中需要注意传输的网络地址正确;注意文件名称的响应编码格式,如果大家在swagger里面测试出现来的类似于%ADBB的名称时注意可以尝试在浏览器直接测试,它把中文文件名做了一个转义会让你错觉认为自己的乱码了。
相关文章
|
3天前
|
Java 程序员 API
Java中的Lambda表达式:简化你的代码
【7月更文挑战第10天】Lambda表达式,这一Java 8的闪亮特性,为开发者提供了一种更为简洁、灵活的编程方式。本文将探讨Lambda表达式如何优化代码结构,提升开发效率,以及在实际项目中应用的一些实例。我们将从基础语法入手,逐步深入到高级用法,最后讨论其性能影响,旨在帮助读者全面理解并有效利用Lambda表达式。
30 20
|
3天前
|
监控 Java Maven
使用AspectJ实现Java代码的运行时织入
使用AspectJ实现Java代码的运行时织入
|
4天前
|
缓存 前端开发 Java
在Java项目中实现高性能的文件上传下载
在Java项目中实现高性能的文件上传下载
|
1天前
|
Java 编译器 API
Java中的Lambda表达式:简化代码,提升性能
在Java 8中,Lambda表达式的引入为开发者提供了一种更加简洁、灵活的编程方式。本文将深入探讨Lambda表达式的概念、语法、使用场景及其在Java中的应用示例,帮助读者更好地理解和掌握这一强大工具,从而优化代码结构,提高开发效率。
|
5天前
|
监控 Java Maven
使用AspectJ实现Java代码的运行时织入
使用AspectJ实现Java代码的运行时织入
|
网络协议 Java API
|
缓存 网络协议 Java