前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Java 将网络链接的图片或视频读取下载到本地,并上传到自己的文件服务器!

Java 将网络链接的图片或视频读取下载到本地,并上传到自己的文件服务器!

作者头像
一个正经的程序员
发布2023-05-26 11:06:52
3K0
发布2023-05-26 11:06:52
举报

前言

需求:将一个 https 网络链接的图片或视频,用 Java 程序读取下载到本地,并上传到自己的文件服务器! 例如一个文件链接:

https://ipfs.io/ipfs/bafybeiawxuupxfab4mrbgsf6vsjagat6i2nqk7pov5tdcnzllwv243raoi

首先,根据链接无法确定这是一个图片还是视频;

其次,并不知道这个文件的扩展名,可能是 .jpg、.png、.mp4、.avi 等等。

几番百度下来,都是需要首先知道该链接的类型和后缀,作为方法参数,就这一个链接,不可能知道,于是决定自己制定解决方案。

解决方案

1、确定文件类型:image 或者 video。通过发送请求,获取到响应头 Content Type。这里用到 Hutool 工具包,安装依赖:

Maven:在项目的 pom.xmldependencies 中加入以下内容:

代码语言:javascript
复制
<dependency>
    <groupId>cn.hutool</groupId>
    <artifactId>hutool-all</artifactId>
    <version>5.8.12</version>
</dependency>

Gradle:

代码语言:javascript
复制
implementation 'cn.hutool:hutool-all:5.8.12'

2、发送请求:结果为 image/png, 可确定文件类型为 image,扩展名为 .png

代码语言:javascript
复制
String url = "https://ipfs.io/ipfs/bafybeiawxuupxfab4mrbgsf6vsjagat6i2nqk7pov5tdcnzllwv243raoi";
String contentType = HttpUtil.createGet(url).execute().header(Header.CONTENT_TYPE);

提供几种常见的文件格式:

.jpg

image/jpg

.jpeg

image/jpeg

.png

image/png

.gif

image/gif

.svg

image/svg+xml

.mp4

video/mp4

.mov

video/quicktime

.wmv

video/x-ms-wmv

.avi

video/avi

3、下载文件

代码语言:javascript
复制
// 下载文件进度 1 / 100
final double[] downloadFileProgress = { 0.1D };
// 新文件名:时间戳-UUID
String newName = String.format("%s-%s", System.currentTimeMillis(), CommonUtil.randomUUID());
// 文件扩展名:从表格进行匹配
String extension = ".png";
// 下载文件:回调下载进度,放在 /temp 目录下
File file = HttpUtil.downloadFileFromUrl(url.getUrl(), new File("/temp/" + newName + extension), new StreamProgress() {
    // 开始下载
    @Override
    public void start() {
        log.info("Start download file...");
    }
    
    // 每隔 10% 记录一次日志
    @Override
    public void progress(long total, long progressSize) {
        double downloadFileProgressTemp = (double) progressSize / total;
        if (downloadFileProgressTemp >= downloadFileProgress[0]) {
            downloadFileProgress[0] += 0.1D;
            log.info("Download file progress: {}% [{} / {}]", downloadFileProgressTemp * 100, progressSize, total);
        }
    }
    
    // 下载成功
    @Override
    public void finish() {
        log.info("Download file success!");
    }
});

4、上传到自己的文件服务器:调用自己项目的文件上传工具类上传文件。

代码语言:javascript
复制
String myServerUrl = FileUtil.upload(file);

5、完成:上传完成后删除临时文件,如果不上传服务器,则不用删除,留在本机。

代码语言:javascript
复制
boolean deleted = file.delete();

过程

看了很多使用 URL 的方法,结果都是各种报错信息,完全不能使用。

代码语言:javascript
复制
URL url = new URL(url);
url.openConnection()

结论

核心方法:

代码语言:javascript
复制
// 执行请求获取响应
HttpResponse cn.hutool.http.HttpRequest.execute();
// 根据 url 下载文件
File cn.hutool.http.HttpUtil.downloadFileFromUrl(String url, File destFile, StreamProgress streamProgress);

今天推荐的 Hutool (🍬A set of tools that keep Java sweet.)是实打实的工具类,包含各种常用的工具,感兴趣的朋友可以 Look Look:https://hutool.cn

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2023-03-01,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 一个正经的程序员 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
    • 解决方案
      • 过程
        • 结论
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档