package com.hoteam.sview.demo;
import cn.hutool.core.io.FileUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.http.ContentType;
import cn.hutool.http.Header;
import cn.hutool.http.HttpRequest;
import cn.hutool.http.HttpResponse;
import cn.hutool.http.HttpStatus;
import cn.hutool.http.Method;
import lombok.extern.slf4j.Slf4j;
import java.io.File;
/**
* 文件上传调用 Demo
* <p>
* 采用 PUT 方式上传文件原始二进制流
* 推荐直接使用 {@link GetUploadUrlDemo} 返回的 uploadUrl 进行上传
* 上传链接有效期由后端接口统一控制
*/
@Slf4j
public class UploadDemo {
/**
* 使用接口返回的上传地址上传文件
*
* @param uploadUrl 由 {@link GetUploadUrlDemo} 获取的上传地址
* @param file 待上传本地文件
* @return 上传成功返回 true,失败返回 false
*/
public static boolean uploadByUploadUrl(String uploadUrl, File file) {
if (StrUtil.isBlank(uploadUrl)) {
log.warn("uploadUrl 不能为空");
return false;
}
if (file == null || !file.exists() || !file.isFile()) {
log.warn("待上传文件不存在或不是文件: [{}]", file);
return false;
}
return uploadByUploadUrl(uploadUrl, FileUtil.readBytes(file));
}
/**
* 使用接口返回的上传地址上传文件(二进制流版本)
*
* @param uploadUrl 由 {@link GetUploadUrlDemo} 获取的上传地址
* @param fileBytes 文件二进制数据
* @return 上传成功返回 true,失败返回 false
*/
public static boolean uploadByUploadUrl(String uploadUrl, byte[] fileBytes) {
if (StrUtil.isBlank(uploadUrl)) {
log.warn("uploadUrl 不能为空");
return false;
}
if (fileBytes == null || fileBytes.length == 0) {
log.warn("文件二进制流不能为空");
return false;
}
HttpRequest request = HttpRequest.of(uploadUrl)
.method(Method.PUT)
.header(Header.CONTENT_TYPE, ContentType.OCTET_STREAM.getValue())
.body(fileBytes)
.timeout(60_000);
try (HttpResponse response = request.execute()) {
int status = response.getStatus();
String respBody = response.body();
log.info("文件上传响应: status=[{}], body=[{}]", status, respBody);
// 统一使用 HTTP 200 状态码判定上传成功
if (status == HttpStatus.HTTP_OK) {
log.info("文件上传成功: size=[{}], uploadUrl=[{}]", fileBytes.length, uploadUrl);
return true;
}
log.warn("文件上传失败: status=[{}]", status);
return false;
} catch (Exception e) {
log.error("文件上传接口异常", e);
return false;
}
}
/**
* 调用入口示例
*/
public static void main(String[] args) {
// 待上传文件
File file = new File("D:/test/test.prt");
// 获取上传地址
GetUploadUrlDemo.UploadUrlResult urlResult = GetUploadUrlDemo
.getUploadUrl(file.getName(), GetUploadUrlDemo.Category.ENT_MY_SPACE);
if (urlResult == null) {
log.warn("获取上传链接失败,终止上传流程");
return;
}
// 文件方式上传
boolean ok = uploadByUploadUrl(urlResult.getUploadUrl(), file);
log.info("文件上传是否成功: {}", ok);
// 二进制方式上传示例
// byte[] bytes = FileUtil.readBytes(file);
// boolean okBytes = uploadByUploadUrl(urlResult.getUploadUrl(), bytes);
// log.info("二进制上传是否成功: {}", okBytes);
}
}