Java实现网络文件下载以及下载到指定目录

 更新时间:2024年09月26日 09:01:20   作者:学习游泳的喵  
在Spring框架中,StreamUtils和FileCopyUtils两个工具类提供了方便的文件下载功能,它们都属于org.springframework.util包,可以通过简单的方法调用实现文件流的复制和下载,这些工具类支持多种参数传递,涵盖了文件下载的多种场景

前言

最近项目中有使用到pdf文件下载功能,在使用过程中,发现spring给我们提供了两个工具类,已经实现了文件下载的功能:

StreamUtils和FileCopyUtils,都是org.springframework.util包下面的类,使用非常方便。

相关代码

service实现类

	public InputStream getDownloadInputStreamByUrl(String downloadUrl) {
		if (ObjectUtils.isEmpty(downloadUrl)) {
            throw new RuntimeException("无效参数:fileUrl 不能为空");
        }
		
		InputStream in = null;
		try {
			URL url = new URL(downloadUrl);

			HttpURLConnection conn = (HttpURLConnection) url.openConnection();
			// 设置超时时间为3秒
			conn.setConnectTimeout(3 * 1000);
			// 防止屏蔽程序抓取而返回403错误
			conn.setRequestProperty("User-Agent", "Mozilla/4.0 (compatible; MSIE 5.0; Windows NT; DigExt)");
			// 得到输入流
			in = conn.getInputStream();
		} catch (Exception e) {
			throw new RuntimeException(e);
		}
		return in;
	}

Controller类

	@GetMapping("/fileDownload/{filename}")
    public void downloadPdfFile(HttpServletResponse response, @PathVariable(name="filename") String filename) {
        try {
            if (StringUtils.isEmpty(filename)) {
            	throw new RuntimeException("文件名不可为空!");
            }
            //通过文件名查找文件对应的url
            String downloadUrl = fileDownloadService.getUrlByFiname(filename);
            if (StringUtils.isEmpty(filename)) {
            	throw new RuntimeException("文件对应地址不存在");
            }
            // 此处异常方法中已处理
            InputStream in = fileDownloadService.getDownloadInputStreamByUrl(downloadUrl);
   			// 设置编码格式
            response.setCharacterEncoding("UTF-8");
            /* 若要下载指定目录,以下两行需注释,否则会下载两份,一份到指定目录,一份到浏览器下载目录 */
            // 设置下载格式
            response.setHeader("Content-Type", "application/pdf");
            // 注释这行代码,可实现 预览 功能(只限pdf文件)
            response.setHeader("Content-Disposition","attachment;filename=" + URLEncoder.encode(filename, "UTF-8"));
			//下载到指定目录
			/*
			File file = new File("C:\\tmp");
            if (!file.exists()) {
                //如果文件夹不存在,则创建新的的文件夹
                file.mkdirs();
            }

            File file1 = new File(file.getPath() + File.separator + filename);
           	OutputStream outputStream = new FileOutputStream(file1);
           	FileCopyUtils.copy(in, outputStream);
           	*/

            StreamUtils.copy(in, response.getOutputStream());
        } catch (Exception e) {
        	throw new RuntimeException(e);
        } 
    }

此处通过spring提供的工具类进行文件下载。

工具类中实现方式:

此处也可通过FileCopyUtils.copy(InputStream input, OutputStream output)实现文件下载,其底层也是通过调用StreamUtils.copy(InputStream in, OutputStream out)方法实现的,不过此方法最后通过finally关闭了InputStream和OutputStream,逻辑更严谨。

这两个工具类中还有其他的导出方法,可以传递其他参数进去,如图:

可以看到,这两个工具类中基本涵盖了文件下载所需的所有操作。

以上代码中对异常只是做了简单的 throw new RuntimeException() 操作,读者可根据自己的项目对异常进行处理。

总结

这些仅为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Mybatis集成到Spring容器的详细步骤

    Mybatis集成到Spring容器的详细步骤

    在现在的JavaEE开发过程中,我们经常会使用到Spring+SpringMVC+Mybatis这个组合,那么Mybatis是如何集成到Spring中的呢,下面通过实例代码给大家详细讲解,感兴趣的朋友跟随小编一起看看吧
    2024-03-03
  • mybatis映射内部类的使用及注意事项说明

    mybatis映射内部类的使用及注意事项说明

    这篇文章主要介绍了mybatis映射内部类的使用及注意事项说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-12-12
  • Mybatis Plus ActiveRecord模式的具体使用

    Mybatis Plus ActiveRecord模式的具体使用

    ActiveRecord 是一种设计模式,它是一种在软件开发中用于管理关系数据库的模式,本文主要介绍了Mybatis Plus ActiveRecord模式的具体使用,具有一定的参考价值,感兴趣的可以了解一下
    2024-07-07
  • JavaWeb中Servlet的生命周期及线程安全问题详解

    JavaWeb中Servlet的生命周期及线程安全问题详解

    这篇文章主要介绍了JavaWeb中Servlet的生命周期及线程安全问题详解,Servlet 生命周期可被定义为从创建直到毁灭的整个过程,Servlet体系结构是建立在Java多线程机制之上的,它的生命周期是由Web容器负责的,需要的朋友可以参考下
    2024-01-01
  • SpringBoot AOP @Pointcut切入点表达式排除某些类方式

    SpringBoot AOP @Pointcut切入点表达式排除某些类方式

    这篇文章主要介绍了SpringBoot AOP @Pointcut切入点表达式排除某些类方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-11-11
  • 解决rror updating database.Cause:java.sql.SQLSyntaxErrorException问题

    解决rror updating database.Cause:java.sql.SQLSyntaxE

    这篇文章主要介绍了解决rror updating database.Cause:java.sql.SQLSyntaxErrorException问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-05-05
  • GC算法实现篇之并发标记清除

    GC算法实现篇之并发标记清除

    这篇文章主要为大家介绍了GC算法实现篇之并发-标记-清除, CMS垃圾收集器在减少停顿时间上做了很多给力的工作, 大量的并发线程执行的工作并不需要暂停应用线程
    2022-01-01
  • 谈谈HttpClient使用详解

    谈谈HttpClient使用详解

    这篇文章给大家介绍HttpClient使用,httpClient是一个客户端的http通信实现库,HttpClient的目标是发送和接收HTTP报文。本文讲解的非常详细,对HttpClient使用感兴趣的朋友可以参考下
    2015-10-10
  • java多种幻灯片切换特效(经典)

    java多种幻灯片切换特效(经典)

    功能说明: 代码实现了多种幻灯片变换特效. 如:淡入淡出、缓慢覆盖、旋转覆盖等10多种变换效果。
    2013-03-03
  • SpringBoot结合ProGuard实现代码混淆(最新版)

    SpringBoot结合ProGuard实现代码混淆(最新版)

    这篇文章主要介绍了SpringBoot结合ProGuard实现代码混淆(最新版),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-10-10

最新评论