需求:将一个 https 网络链接的图片或视频,用 Java 程序读取下载到本地,并上传到自己的文件服务器! 例如一个文件链接:
https://ipfs.io/ipfs/bafybeiawxuupxfab4mrbgsf6vsjagat6i2nqk7pov5tdcnzllwv243raoi
首先,根据链接无法确定这是一个图片还是视频;
其次,并不知道这个文件的扩展名,可能是 .jpg、.png、.mp4、.avi 等等。
几番百度下来,都是需要首先知道该链接的类型和后缀,作为方法参数,就这一个链接,不可能知道,于是决定自己制定解决方案。
1、确定文件类型:image 或者 video。通过发送请求,获取到响应头 Content Type。这里用到 Hutool 工具包,安装依赖:
Maven:在项目的 pom.xml 的 dependencies 中加入以下内容:
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.8.12</version>
</dependency>
Gradle:
implementation 'cn.hutool:hutool-all:5.8.12'
2、发送请求:结果为 image/png, 可确定文件类型为 image,扩展名为 .png
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、下载文件
// 下载文件进度 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、上传到自己的文件服务器:调用自己项目的文件上传工具类上传文件。
String myServerUrl = FileUtil.upload(file);
5、完成:上传完成后删除临时文件,如果不上传服务器,则不用删除,留在本机。
boolean deleted = file.delete();
看了很多使用 URL 的方法,结果都是各种报错信息,完全不能使用。
URL url = new URL(url);
url.openConnection()
核心方法:
// 执行请求获取响应
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