当前位置: 首页 > 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>

相关文章:

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

直接上代码 controller层 GetMapping("/downloadAndUploadAttachment")UpdateOperationLogging(msg "根据路径下载文件转换为MultipartFile,并且上传到服务器")Operation(summary "根据路径下载文件转换为MultipartFile,并且上传到服务器", de…...

Onvif服务端开发

实现了Onvif服务端的设备搜索和RTSP流的功能。用 ONVIF Device Manager 测试工具可以成功搜索到设备和获取到RTSP流&#xff0c;有的路由器可能不支持239.255.255.250组播&#xff0c;我一开始用的电信的那种光猫路由器二合一的&#xff0c;一直搜不到设备&#xff0c;后面用So…...

【jvm】主要参数

Java 虚拟机&#xff08;JVM&#xff09;有许多参数用于控制其行为和性能&#xff0c;下面是一些 主要的 JVM 启动参数&#xff0c;这些参数通常分为以下几类&#xff1a; 内存管理相关参数 这些参数主要用来配置 JVM 的内存分配策略、堆内存、栈内存等。 -Xms 设置 JVM 启动…...

【优选算法】—移动零(双指针算法)

云边有个稻草人-CSDN博客 想当一名牛的程序员怎么能少的了练习算法呢&#xff1f;&#xff01; 今天就立即开启一个新专栏&#xff0c;专干算法&#xff0c;提高算法能力&#xff08;废柴的我也在准备蓝桥杯哈哈&#xff09;—— 目录 1.【 283. 移动零 - 力扣&#xff08;Lee…...

PostgreSQL标识符长度限制不能超过63字节

文章目录 问题&#xff1a;标识符太长会被截断分析相关源码可以尝试以下案例 问题&#xff1a;标识符太长会被截断 在创建表时&#xff0c;发现表名太长会自动被截断&#xff0c;导致查询表时报错了。 分析 参考&#xff1a;https://www.postgresql.org/docs/current/limits…...

嵌入式硬件面试题

1、请问什么是通孔、盲孔和埋孔&#xff1f;孔径多大可以做机械孔&#xff0c;孔径多小必须做激光孔&#xff1f;请问激光微型孔可以直接打在元件焊盘上吗&#xff0c;为什么&#xff1f; 通孔是贯穿整个PCB的过孔&#xff0c;盲孔是从PCB表层连接到内层的过孔&#xff0c;埋孔…...

深度解析 OneCode 混合编译:创新驱动的开发变革

前言 在软件开发领域&#xff0c;不断追求高效、灵活与强大的开发模式是永恒的主题。OneCode 作为一款引领潮流的开发工具&#xff0c;其混合编译特性正逐渐成为开发界瞩目的焦点。本文将深入剖析 OneCode 的混合编译机制&#xff0c;揭示它如何为软件开发带来前所未有的变革与…...

[文献阅读] Unsupervised Deep Embedding for Clustering Analysis (无监督的深度嵌入式聚类)

文章目录 Abstract:摘要聚类深度聚类 KL散度深度嵌入式聚类(DEC)KL散度聚类软分配&#xff08;soft assignment&#xff09;KL散度损失训练编码器的初始化聚类中心的初始化 实验评估总结 Abstract: This week I read Unsupervised Deep Embedding for Clustering Analysis .It…...

ajax中get和post的区别,datatype返回的数据类型有哪些?web开发中数据提交的几种方式,有什么区别。

在 Web 开发中&#xff0c;GET 和 POST 是两种常见的 HTTP 请求方法&#xff0c;它们有一些显著的区别。此外&#xff0c;datatype 参数在 jQuery 的 ajax() 请求中指定了预期的响应数据类型。接下来&#xff0c;我会详细解释这些问题。 1. GET 和 POST 请求的区别 GET 请求 和…...

网络七层杀伤链

声明&#xff01; 学习视频来自B站up主 **泷羽sec** 有兴趣的师傅可以关注一下&#xff0c;如涉及侵权马上删除文章&#xff0c;笔记只是方便各位师傅的学习和探讨&#xff0c;文章所提到的网站以及内容&#xff0c;只做学习交流&#xff0c;其他均与本人以及泷羽sec团队无关&…...

GAN网络详解及涨点大全总结(源码)

(需要源码请私信或评论) GAN原理 GAN的基本原理建立在 生成模型和判别模型的博弈过程 上。这种独特的机制使得GAN能够在复杂的分布上实现高效的无监督学习。在这个过程中,生成器G和判别器D相互竞争,最终达到一种平衡状态,在此状态下,G能够产生高质量的合成样本,而D则无…...

【自动化】Python SeleniumUtil 工具 开启开发者模式 自动安装油猴用户脚本等

【自动化】Python SeleniumUtil 工具 【Python】使用Selenium 操作浏览器 自动化测试 记录-CSDN博客文章浏览阅读58次。文章浏览阅读42次。【附件】Selenium chromedriver 驱动及浏览器下载。【附件】Selenium chromedriver 驱动及浏览器下载-CSDN博客。3.安装Chrome浏览器驱动…...

【Linux打怪升级记 | 问题01】安装Linux系统忘记设置时区怎么办?3个方法教你回到东八区

&#x1f5fa;️博客地图 &#x1f4cd;方法一、timedatectl 命令 &#x1f4cd;方法二、手动链接 /etc/localtime &#x1f4cd;方法三、修改时区变量 在 Linux 系统中&#xff0c;可以通过以下3种方式将系统时区修改为 CST&#xff08;中国标准时间&#xff0c;GMT8 或称 …...

android:sharedUserId 应用进程声明介绍

背景 adb install 安装系统软件报错,原因是签名不一致,进程改变。 代码分析 AndroidManifest.xml 定义的 android:sharedUserId 应用归属进程不同,从phone切换到system。 初始配置 <manifest xmlns:android="http://schemas.android.com/apk/res/android"c…...

解锁ApplicationContext vs BeanFactory: 谁更具选择性?

目录 一、聚焦源码回顾 &#xff08;一&#xff09;源码分析和理解 &#xff08;二&#xff09;简短的回顾对比建议 二、ApplicationContext vs BeanFactory特性对比 &#xff08;一&#xff09;主要特性总结 &#xff08;二&#xff09;直接建议 三、案例简单说明 &am…...

一篇梳理清楚http请求知识点

HTTP请求是Web开发中的重要组成部分&#xff0c;它涉及到客户端和服务器之间的通信。掌握HTTP请求的知识点对于前端开发和后端开发都至关重要。以下是关于HTTP请求的详细梳理&#xff0c;结合代码进行说明。 1. HTTP请求概述 HTTP&#xff08;超文本传输协议&#xff09;是一个…...

Kotlin - 协程结构化并发Structured Concurrency

前言 Kotlin的Project Lead&#xff0c;Roman Elizarov的一片文章https://elizarov.medium.com/structured-concurrency-722d765aa952介绍了Structured Concurrency发展的背景。相对Kotlin1.1时代&#xff0c;后来新增的Structured Concurrency理念&#xff0c;也就是我们现在所…...

新版国标GB28181设备端Android版EasyGBD支持国标GB28181-2022,支持语音对讲,支持位置上报,开源在Github

经过近3个月的迭代开发&#xff0c;新版本的国标GB28181设备端EasyGBD安卓Android版终于在昨天发布到Github了&#xff0c;最新的EasyGBD支持了国标GB28181-2022版&#xff0c;还支持了语音对讲、位置上报、本地录像等功能&#xff0c;比原有GB28181-2016版的EasyGBD更加高效、…...

豆包MarsCode测评:编程效率再提升

豆包MarsCode测评&#xff1a;编程效率再提升 本文正在参与豆包MarsCode AI 编程体验家活动 随着人工智能技术的发展&#xff0c;编程的方式也在悄然发生变化。最近&#xff0c;豆包推出的 AI 编程工具 MarsCode 在开发者社区引发了不小的关注。这是一款支持多种主流编程语言…...

二叉树 -- 堆(详解)

目录 1、堆的概念及结构 2、堆的实现(附代码) 2.1、向下调整算法建堆 3、堆的应用(附代码) 3.1、堆排序 3.2、TOP-K问题 1、堆的概念及结构 如果有一个关键码的集合K { k0&#xff0c;k1 &#xff0c;k2 &#xff0c;…&#xff0c;k(n-1) }&#xff0c;把它的所有元素…...

Unity3D中Gfx.WaitForPresent优化方案

前言 在Unity中&#xff0c;Gfx.WaitForPresent占用CPU过高通常表示主线程在等待GPU完成渲染&#xff08;即CPU被阻塞&#xff09;&#xff0c;这表明存在GPU瓶颈或垂直同步/帧率设置问题。以下是系统的优化方案&#xff1a; 对惹&#xff0c;这里有一个游戏开发交流小组&…...

【网络安全产品大调研系列】2. 体验漏洞扫描

前言 2023 年漏洞扫描服务市场规模预计为 3.06&#xff08;十亿美元&#xff09;。漏洞扫描服务市场行业预计将从 2024 年的 3.48&#xff08;十亿美元&#xff09;增长到 2032 年的 9.54&#xff08;十亿美元&#xff09;。预测期内漏洞扫描服务市场 CAGR&#xff08;增长率&…...

跨链模式:多链互操作架构与性能扩展方案

跨链模式&#xff1a;多链互操作架构与性能扩展方案 ——构建下一代区块链互联网的技术基石 一、跨链架构的核心范式演进 1. 分层协议栈&#xff1a;模块化解耦设计 现代跨链系统采用分层协议栈实现灵活扩展&#xff08;H2Cross架构&#xff09;&#xff1a; 适配层&#xf…...

苍穹外卖--缓存菜品

1.问题说明 用户端小程序展示的菜品数据都是通过查询数据库获得&#xff0c;如果用户端访问量比较大&#xff0c;数据库访问压力随之增大 2.实现思路 通过Redis来缓存菜品数据&#xff0c;减少数据库查询操作。 缓存逻辑分析&#xff1a; ①每个分类下的菜品保持一份缓存数据…...

Neo4j 集群管理:原理、技术与最佳实践深度解析

Neo4j 的集群技术是其企业级高可用性、可扩展性和容错能力的核心。通过深入分析官方文档,本文将系统阐述其集群管理的核心原理、关键技术、实用技巧和行业最佳实践。 Neo4j 的 Causal Clustering 架构提供了一个强大而灵活的基石,用于构建高可用、可扩展且一致的图数据库服务…...

css的定位(position)详解:相对定位 绝对定位 固定定位

在 CSS 中&#xff0c;元素的定位通过 position 属性控制&#xff0c;共有 5 种定位模式&#xff1a;static&#xff08;静态定位&#xff09;、relative&#xff08;相对定位&#xff09;、absolute&#xff08;绝对定位&#xff09;、fixed&#xff08;固定定位&#xff09;和…...

智能分布式爬虫的数据处理流水线优化:基于深度强化学习的数据质量控制

在数字化浪潮席卷全球的今天&#xff0c;数据已成为企业和研究机构的核心资产。智能分布式爬虫作为高效的数据采集工具&#xff0c;在大规模数据获取中发挥着关键作用。然而&#xff0c;传统的数据处理流水线在面对复杂多变的网络环境和海量异构数据时&#xff0c;常出现数据质…...

Device Mapper 机制

Device Mapper 机制详解 Device Mapper&#xff08;简称 DM&#xff09;是 Linux 内核中的一套通用块设备映射框架&#xff0c;为 LVM、加密磁盘、RAID 等提供底层支持。本文将详细介绍 Device Mapper 的原理、实现、内核配置、常用工具、操作测试流程&#xff0c;并配以详细的…...

API网关Kong的鉴权与限流:高并发场景下的核心实践

&#x1f525;「炎码工坊」技术弹药已装填&#xff01; 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 引言 在微服务架构中&#xff0c;API网关承担着流量调度、安全防护和协议转换的核心职责。作为云原生时代的代表性网关&#xff0c;Kong凭借其插件化架构…...

沙箱虚拟化技术虚拟机容器之间的关系详解

问题 沙箱、虚拟化、容器三者分开一一介绍的话我知道他们各自都是什么东西&#xff0c;但是如果把三者放在一起&#xff0c;它们之间到底什么关系&#xff1f;又有什么联系呢&#xff1f;我不是很明白&#xff01;&#xff01;&#xff01; 就比如说&#xff1a; 沙箱&#…...