当前位置: 首页 > news >正文

java 根据路径下载文件转换为MultipartFile,并且上传到服务器

直接上代码
controller层

	@GetMapping("/downloadAndUploadAttachment")@UpdateOperationLogging(msg = "根据路径下载文件转换为MultipartFile,并且上传到服务器")@Operation(summary = "根据路径下载文件转换为MultipartFile,并且上传到服务器", description = "根据路径下载文件转换为MultipartFile,并且上传到服务器")public R<Integer> downloadAndUploadAttachment() throws IOException {//第一个参数是一个类似于文件的存储路径,在浏览器输入可以直接下载,第二个参数是文件名称
//		String url = externalFileService.downloadAndUploadAttachment("https://attachmentgw.trinasolar.com/fs/ts/q8sc1zw9veq5fays2bo2sd8e/20241015/3A75DBB77A6649ACB1657710D822ED21.xlsx", "新建 Microsoft Excel 工作表.xlsx");String url = externalFileService.downloadAndUploadAttachment("https://attachmentgw.trinasolar.com/fs/ts/q8sc1zw9veq5fays2bo2sd8e/20241015/9AEE920F274947E392554EFB49BFC31E.jpeg", "2024-09-24_084333.jpeg");//打印返回的路径在浏览器也是可以直接下载(这样主要是解决一个跨域问题)System.out.println(url);return null;}

service层

package com.trinasolar.admin.service.impl;import com.hccake.ballcat.common.model.result.R;
import com.trinasolar.admin.controller.UploadController;
import com.trinasolar.devops.file.core.exception.UploadFailedException;
import com.trinasolar.devops.file.core.exception.UserTokenFetchIllegalExeption;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileItemFactory;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.conn.ssl.NoopHostnameVerifier;
import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.ssl.SSLContextBuilder;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;import javax.net.ssl.SSLContext;
import java.io.IOException;
import java.io.InputStream;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.StandardCopyOption;
import java.security.KeyManagementException;
import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException;
import java.util.Map;
@Service
@Slf4j
public class ExternalFileService {@AutowiredUploadController uploadController;/*** 从外部URL下载文件,并将其上传到服务器。** @param externalFileUrl 外部文件的URL* @param fileName 文件名* @throws IOException 如果下载或读取文件时发生IO异常*/public String downloadAndUploadAttachment(String externalFileUrl, String fileName) throws IOException {try (CloseableHttpClient httpClient = createIgnoreSSLClient()) { // 创建一个忽略SSL验证的HTTP客户端HttpGet httpGet = new HttpGet(externalFileUrl); // 创建GET请求try (CloseableHttpResponse response = httpClient.execute(httpGet)) { // 执行GET请求if (response.getStatusLine().getStatusCode() == 200) { // 检查响应状态码是否为200InputStream inputStream = response.getEntity().getContent(); // 获取响应内容的输入流Path tempFile = Files.createTempFile("attachment", ""); // 创建临时文件Files.copy(inputStream, tempFile, StandardCopyOption.REPLACE_EXISTING); // 将输入流写入临时文件// 创建MultipartFile对象MultipartFile multipartFile = createMultipartFile(tempFile, fileName);// 上传文件R<Map> uploadResult = uploadController.upload(multipartFile);return (String) uploadResult.getData().get("url");} else {throw new RuntimeException("Failed to download file: " + response.getStatusLine());}}} catch (KeyStoreException | NoSuchAlgorithmException | KeyManagementException e) {log.error("Failed to create HTTP client with ignored SSL", e);throw new RuntimeException("Failed to create HTTP client with ignored SSL", e);} catch (UploadFailedException | UserTokenFetchIllegalExeption e) {log.error("Failed to upload file", e);throw new RuntimeException("Failed to upload file", e);} catch (IOException e) {log.error("IO error occurred", e);throw new RuntimeException("IO error occurred", e);}}/*** 创建忽略SSL验证的HTTP客户端** @return 忽略SSL验证的HTTP客户端* @throws KeyStoreException 如果密钥库操作失败* @throws NoSuchAlgorithmException 如果找不到算法* @throws KeyManagementException 如果密钥管理操作失败*/private CloseableHttpClient createIgnoreSSLClient() throws KeyStoreException, NoSuchAlgorithmException, KeyManagementException {SSLContext sslContext = SSLContextBuilder.create().loadTrustMaterial(null, (chain, authType) -> true) // 信任所有证书.build();SSLConnectionSocketFactory sslSocketFactory = new SSLConnectionSocketFactory(sslContext, NoopHostnameVerifier.INSTANCE);return HttpClients.custom().setSSLSocketFactory(sslSocketFactory).build();}/*** 创建MultipartFile对象** @param tempFile 临时文件路径* @param fileName 文件名* @return MultipartFile对象* @throws IOException 如果读取文件时发生IO异常*/private MultipartFile createMultipartFile(Path tempFile, String fileName) throws IOException {FileItemFactory factory = new DiskFileItemFactory();FileItem fileItem = factory.createItem("file", "application/octet-stream", true, fileName);fileItem.getOutputStream().write(Files.readAllBytes(tempFile));fileItem.getOutputStream().close();return new org.springframework.web.multipart.commons.CommonsMultipartFile(fileItem);}
}

上传文件的方法,这里上传大家作为一个参考即可,
是引用了公司的一个依赖

上传是使用公司的依赖

<dependency><groupId>com.trinasolar.devops.file</groupId><artifactId>file-spring-boot-starter</artifactId><version>1.0.0.1-SNAPSHOT</version>
</dependency>@RestController
@RequestMapping("/upload")
@Tag(name = "文件服务上传")
public class UploadController {private final Uploader uploader;public UploadController(Uploader uploader) {this.uploader = uploader;}@PostMapping("/uploadFile")public R<Map> upload(MultipartFile file) throws UserTokenFetchIllegalExeption, IOException, UploadFailedException {String fileUrl = this.uploader.Upload(file);String replace = fileUrl.replace("http", "https");Map<String, String> map = new HashMap<>();map.put("name", file.getOriginalFilename());map.put("url", replace);return R.ok(map);}}

该过程使用的全部依赖

		<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.apache.httpcomponents</groupId><artifactId>httpclient</artifactId><version>4.5.13</version> <!-- 或最新版本 --></dependency><dependency><groupId>commons-fileupload</groupId><artifactId>commons-fileupload</artifactId><version>1.4</version> <!-- 或最新版本 --></dependency><dependency><groupId>commons-io</groupId><artifactId>commons-io</artifactId><version>2.11.0</version> <!-- 或最新版本 --></dependency>
http://www.lryc.cn/news/507844.html

相关文章:

  • Onvif服务端开发
  • 【jvm】主要参数
  • 【优选算法】—移动零(双指针算法)
  • PostgreSQL标识符长度限制不能超过63字节
  • 嵌入式硬件面试题
  • 深度解析 OneCode 混合编译:创新驱动的开发变革
  • [文献阅读] Unsupervised Deep Embedding for Clustering Analysis (无监督的深度嵌入式聚类)
  • ajax中get和post的区别,datatype返回的数据类型有哪些?web开发中数据提交的几种方式,有什么区别。
  • 网络七层杀伤链
  • GAN网络详解及涨点大全总结(源码)
  • 【自动化】Python SeleniumUtil 工具 开启开发者模式 自动安装油猴用户脚本等
  • 【Linux打怪升级记 | 问题01】安装Linux系统忘记设置时区怎么办?3个方法教你回到东八区
  • android:sharedUserId 应用进程声明介绍
  • 解锁ApplicationContext vs BeanFactory: 谁更具选择性?
  • 一篇梳理清楚http请求知识点
  • Kotlin - 协程结构化并发Structured Concurrency
  • 新版国标GB28181设备端Android版EasyGBD支持国标GB28181-2022,支持语音对讲,支持位置上报,开源在Github
  • 豆包MarsCode测评:编程效率再提升
  • 二叉树 -- 堆(详解)
  • 【Apache Paimon】-- 11 -- Flink 消费 kakfa 写 S3 File
  • SQL MID()
  • jsp | servlet | spring forEach读取不了对象List
  • 【ArcGIS Pro微课1000例】0063:处理无人机数据(空三、生成DOM、DSM、DTM)
  • 【pytorch】深度学习计算
  • 详解磁盘IO、网络IO、零拷贝IO、BIO、NIO、AIO、IO多路复用(select、poll、epoll)
  • VPN技术-GRE隧道的配置
  • 【spring-cloud-gateway总结】
  • 数组相关简单算法
  • 在VBA中结合正则表达式和查找功能给文档添加交叉连接
  • 动手学深度学习-多层感知机-7前向传播、反向传播和计算图