当前位置: 首页 > article >正文

java 通过远程URL实现文件下载几种方式

文章目录

    • 概要
    • 需要具备参数
    • 实现的四种方式:
    • 小结

概要

java环境下通过远程接口实现文件下载几种方式:

  1. 使用NIO下载文件, 需要 jdk 1.7+
  2. 利用 commonio 库下载文件,依赖Apache Common IO
  3. 文件通道FileChahhel
  4. 通过URL直接下载转换成MultipartFile
  5. 接口服务直接返回文件流

需要具备参数

  1. 文件内容
  2. 保存地址
  3. 文件名称类型(后缀)

实现的四种方式:

使用NIO下载文件

/*** 使用NIO下载文件, 需要 jdk 1.7+* @param url 下载地址* @param saveDir 保存地址* @param fileName 文件名称*/public static void downloadByNIO(String url, String saveDir, String fileName) {try (InputStream ins = new UrlResource(url).getInputStream()) {Path target = Paths.get(saveDir, fileName);Files.createDirectories(target.getParent());Files.copy(ins, target, StandardCopyOption.REPLACE_EXISTING);} catch (IOException e) {log.error("文件下载失败:" + e.getMessage());throw new RuntimeException("downloadByNIO error from remoteUrl", e);}}

利用Apache common io 库下载文件

    /*** 利用 commonio 库下载文件,依赖Apache Common IO* @param url 下载地址* @param saveDir 保存地址* @param fileName 文件名称*/public static void downloadByApacheCommonIO(String url, String saveDir, String fileName) {try {FileUtils.copyURLToFile(new URL(url), new File(saveDir, fileName));} catch (IOException e) {log.error("文件下载失败:" + e.getMessage());throw new RuntimeException("downloadByApacheCommonIO error from remoteUrl", e);}}

使用文件通道FileChahhel下载文件

/*** 文件下载* 使用文件通道FileChahhel下载文件* @param downloadUrl 下载地址*/public static void downloadFileByChannel(String downloadUrl, String tempPath) {ReadableByteChannel readableByteChannel;FileUtil.createTempFile(new File(tempPath));try (FileChannel fileChannel = new FileOutputStream(FileUtil.createTempFile(new File(tempPath))).getChannel()){URL url = new URL(downloadUrl);readableByteChannel = Channels.newChannel(new BufferedInputStream(url.openStream()));fileChannel.transferFrom(readableByteChannel, 0, Long.MAX_VALUE);} catch (Exception e) {log.error("文件下载失败:" + e.getMessage());throw new RuntimeException("downloadFileByChannel error from downloadUrl", e);}}

通过URL直接转换成MutipartFile

public static MultipartFile getFileFromUrl(String url, String fileName) throws IOException {// Create a resource from the URLURL urlObj = new URL(url);HttpURLConnection connection = (HttpURLConnection) urlObj.openConnection();connection.setRequestMethod("GET");connection.setConnectTimeout(10000);connection.setReadTimeout(60000);connection.setDoOutput(true);DiskFileItemFactory fileItemFactory = new DiskFileItemFactory();DiskFileItem fileItem = (DiskFileItem) fileItemFactory.createItem("file",MediaType.ALL_VALUE, true, fileName);fileItem.getOutputStream().flush();try (ReadableByteChannel readableByteChannel = Channels.newChannel(connection.getInputStream());OutputStream outputStream = fileItem.getOutputStream();WritableByteChannel writableByteChannel = Channels.newChannel(outputStream)) {// Create a byte buffer to store the file contentByteBuffer buffer = ByteBuffer.allocateDirect(1024 << 2);// Read the file content into the byte bufferwhile (readableByteChannel.read(buffer) != -1) {// Prepare the byte buffer to be read againbuffer.flip();while (buffer.hasRemaining()) {writableByteChannel.write(buffer);}buffer.clear();}} catch (Exception e) {// Handle network or file IO exceptions herelog.error("Error uploading file", e);throw e;}return new CommonsMultipartFile(fileItem);}

接口服务直接返回文件流

	@PostMapping("/download")public ResponseEntity<InputStreamResource> downloadFile(String url) throws IOException {// 从远程地址下载文件流URL remoteUrl = new URL(url);URLConnection connection = remoteUrl.openConnection();ReadableByteChannel readableByteChannel = Channels.newChannel(connection.getInputStream());// 设置响应头信息HttpHeaders headers = new HttpHeaders();headers.add("Content-Disposition", "attachment; filename=" + url.substring(url.lastIndexOf("/") + 1));MediaType mediaType = ObjectUtils.defaultIfNull(MediaType.parseMediaType(connection.getContentType()), MediaType.APPLICATION_OCTET_STREAM);// 返回文件流给请求端return ResponseEntity.ok().headers(headers).contentType(mediaType).body(new InputStreamResource(Channels.newInputStream(readableByteChannel)));}

小结

这里没有小洁
http://www.lryc.cn/news/2419517.html

相关文章:

  • 《工程电磁场》学习笔记1-静电场
  • 研究生们都在推荐哪些好用的论文在线翻译软件?
  • 【STM32学习笔记】(9)——串口通讯(USART)详解
  • 机器学习(四)—— 多项式回归
  • 如何解决IDEA中输入sout,psvm后没有自动联想功能的问题。
  • Linux-UGO用户权限
  • HTML Help Workshop(chm生成工具)的使用
  • 汉字转Unicode编码
  • Java 性能优化实战工具实践:基准测试 JMH,精确测量方法性能
  • 网络通信基础(入门知识总结)
  • 实现动态数组
  • 四大主流云平台对比--CloudStack, Eucalyptus, vCloud Director和OpenStack。
  • 37.绘制文本DrawText、DrawTextEx、DRAWTEXTPARAMS 使用
  • SQL语法——触发器
  • 卷!推荐11个做PPT的神仙网站
  • xshell安装错误:-1605这个操作只对当前安装的产品有效
  • 系统架构图
  • Python 三个拆分函数(split、rsplit、splitlines)不同的用法
  • PUBG介绍
  • 网页星号密码查看器_四大密码查看器 星号、浏览器保存密码、连接过的WIFI账号密码...
  • Java中慎用e.printStackTrace()
  • 2022年诺贝尔物理学奖背后的故事——贝尔不等式诞生之后
  • SurfaceView 基本使用
  • 硬件测试需要什么软件是什么原因,什么硬件软件检测温度准啊
  • zeros什么意思_什么是张量?
  • Ubuntu Touch的小确幸(Linux系统手机Ubports)
  • 数据结构(C语言版)--速成笔记【持续更新中。。】
  • MPEG-4视频压缩基础
  • 【FISCO-BCOS】 一、默认配置搭建区块链网络
  • textmate开发一个blog