直接上代码
/**
* @description: 根据下载链接上传附件信息
* @author ssss
* @param yswjlj 原始文件路径
* @param fjlx 附件类型
* @date 2024/3/7 15:35
* @version 1.0
*/
@Override
public MultiModeUploadRespDTO multiModeUpload(String yswjlj, String fjlx) {
File file = null;
MultiModeUploadRespDTO respDTO = null;
String fileName = getFileName();//此处根据自己业务需要获取自定义文件名称
try {
file = createTempFile(yswjlj,fileName);
System.out.println("文件已保存至:" + file.getAbsolutePath());
System.out.println("文件名称:" + file.getName());
// 读取文件内容并构造字节数组
byte[] bytesArray = Files.readAllBytes(Paths.get(file.getAbsolutePath()));
// 设置文件名、原始文件名和MIME类型等信息
String originalFilename = file.getName();
// 判断文件存在并且不是目录
if (file.exists() && !file.isDirectory()) {
long sizeInBytes = file.length();
// 将字节转换成MB
double resultMb = (double) sizeInBytes / (double) (1024 * 1024);
//取两位小数
double sizeInMb = Math.round(resultMb * 100) / 100.0;
System.out.println("文件大小 resultMb:" + resultMb + " MB");
System.out.println("文件大小 sizeInMb:" + sizeInMb + " MB");
// 创建MultipartFile对象
MultipartFile multipartFile = new MockMultipartFile(originalFilename, originalFilename, fjlx, bytesArray);
String multiModeType = SpringUtils.getBean(ISysConfigService.class).selectConfigByKey("sys.upload.type");
// 上传并返回访问地址
respDTO = multiModeFileSimpleContext.multiModeUpload(multipartFile, multiModeType);
respDTO.setSizeInMb(sizeInMb);
}
} catch (Exception e) {
log.error("上传文件失败", e);
} finally {
if (file.exists()) {
boolean flag = file.delete();
System.out.println("file是否删除成功:"+flag);
}
}
return respDTO;
}
/**
* 在本地创建一个临时文件
*
* @param url 远端文件Url
* @return File
*/
public File createTempFile (String url,String fileName){
//对本地文件命名
String fileSuffix = url.substring(url.lastIndexOf("."), url.length());
File file = new File(fileName+fileSuffix); // 要保存的文件名及路径
URL urlfile;
try {
System.out.println("tempFile:->{}"+ file.getAbsolutePath());
//下载
urlfile = new URL(url);
// try 小括号里面的部分称为 try-with-resources 块,将实现了 java.lang.AutoCloseable 接口的资源定义在 try 后面的小括号中,
// 无论 try 块是正常结束还是异常结束,这个资源都会被自动关闭
try (InputStream inStream = urlfile.openStream();
OutputStream os = new FileOutputStream(file);) {
int bytesRead = 0;
byte[] buffer = new byte[8192];
while ((bytesRead = inStream.read(buffer, 0, 8192)) != -1) {
os.write(buffer, 0, bytesRead);
}
}
} catch (Exception e) {
e.printStackTrace();
}
return file;
}
/**
* Minio文件上传接口
*
* @param file 上传的文件
* @return 访问地址
* @throws Exception
*/
@Override
public String uploadFile(MultipartFile file) throws Exception
{
String originalFilename = file.getOriginalFilename();
InputStream inputStream = file.getInputStream();
PutObjectArgs args = PutObjectArgs.builder()
.bucket(minioConfig.getBucketName())
.object(originalFilename)
.stream(inputStream, -1, 10485760)//上传未知大小的文件
.build();
client.putObject(args);
IoUtils.closeQuietly(inputStream);
// 目前提供永久有效的链接,如果需要私有文件链接,需要实现获取链接接口
return minioConfig.getUrl() + "/" + minioConfig.getBucketName() + "/" + originalFilename;
}