欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

用Java从网络下载图片和视频到本地,然后上传到你的个人文件服务器!

最编程 2024-08-03 18:03:47
...

前言

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

https://ipfs.io/ipfs/bafybeiawxuupxfab4mrbgsf6vsjagat6i2nqk7pov5tdcnzllwv243raoi

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

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

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

解决方案

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

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

<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

推荐阅读