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…...
递归实现指数型枚举(递归)
92. 递归实现指数型枚举 - AcWing题库 每个数有选和不选两种情况 我们把每个数看成每层,可以画出一个递归搜索树 叶子节点就是我们的答案 很容易写出每dfs函数 dfs传入一个u表示层数 当层数大于我们n时,去判断每个数字的选择情况,输出被选…...
WebMvcConfigurer和WebMvcConfigurationSupport(MVC配置)
一:基本介绍 WebMvcConfigurer是接口,用于配置全局的SpringMVC的相关属性,采用JAVABean的方式来代替传统的XML配置文件,提供了跨域设置、静态资源处理器、类型转化器、自定义拦截器、页面跳转等能力。 WebMvcConfigurationSupport是webmvc的…...
HIPT论文阅读
题目《Scaling Vision Transformers to Gigapixel Images via Hierarchical Self-Supervised Learning》 论文地址:[2206.02647] Scaling Vision Transformers to Gigapixel Images via Hierarchical Self-Supervised Learning 项目地址:mahmoodlab/HI…...
完全二叉树的权值(蓝桥杯2019年试题G)
给定一棵包含N个节点的完全二叉树,树上的每个节点都有一个权值,按从上到小、从左到右的顺序依次是A1、A2……An,(1,2,n为下标。)如下图所示。 现在,小明要把相同深度的节点的权值加到一起&#…...
用adb命令给APP做压力测试,有什么不同?
压力测试 app做压力测试目的是模拟用户在使用软件时随意向软件发出指令,例如操作app的点击,滑动,返回等一系列随机事件,来检测app的承受能力 第一步:手机安装包需要待测的app 第二步:输入adb start-ser…...
Spring 6 实现 Bean 异步初始化,减少项目启动时间
在 Spring 6 中,异步初始化 Bean 为优化应用启动性能提供了有力手段。通过让特定的 Bean 在后台进行初始化,避免其阻塞应用的启动流程,从而显著缩短应用从启动到对外提供服务的时间。 一、基础环境搭建 首先,确保项目的依赖中引入…...
【案例80】麒麟操作系统无法使用Uclient访问NC65
问题现象 麒麟操作系统,安装Uclient,添加应用后无法看到登录界面,一直在转圈。 问题分析 进入到Uclient的工作目录 发现在工作目录下,无相关app.log生成。 查看Uclient的main.log发现,有大量的报错与Uclient下的sha…...
一个签名笔迹量化分析专家辅助系统
写在正文前 关于签名的鉴定有国家制定的标准,一个小册子,好像是 80多页 ,俺看的还是 2000年版的,现在应该有很多新版本了。这方面有很多教材和书籍。而且国家也有专门的评审。 正文开始 这是翻老硬盘时发现的,09年左…...
富途证券C++面试题及参考答案
C++ 中堆和栈的区别 在 C++ 中,堆和栈是两种不同的内存区域,它们有许多区别。 从内存分配方式来看,栈是由编译器自动分配和释放的内存区域。当一个函数被调用时,函数内的局部变量、函数参数等会被压入栈中,这些变量的内存空间在函数执行结束后会自动被释放。例如,在下面的…...
鸿蒙app封装 axios post请求失败问题
这个问题是我的一个疏忽大意,在这里记录一下。如果有相同问题的朋友,可以借鉴。 当我 ohpm install ohos/axios 后,进行简单post请求验证,可以请求成功。 然后,我对axios 进行了封装。对axios 添加请求拦截器/添加响…...
详解 Qt WebEngine 模块
Qt WebEngine 模块是 Qt 提供的一个功能强大的模块,用于在 Qt 应用中嵌入和显示现代网页内容。该模块基于 Chromium 引擎,支持丰富的 Web 技术(如 HTML5、CSS3、JavaScript 等),适合需要嵌入网页浏览、Web 应用、JavaS…...
常用的缓存技术都有哪些
在计算机科学和软件开发领域,缓存技术是提高系统性能和响应速度 1. 本地缓存(Local Cache): • 存在于应用程序本地内存中的缓存,用于存储频繁访问的数据,以减少对外部存储(如数据库)…...
MySQL通过日志恢复数据的步骤
试验环境:Windows Server2012 r2、MySql-8.0.27-winx64。 1、先检查MySQL有没有开启binlog日志 通过下面的SQL命令查看MySQL是否开启日志以及日志文件的位置: show variables like %log_bin% 执行结果如下图所示: 图中,log_bi…...
SQL Server 表值函数使用示例
在 SQL Server 中,表值函数(Table-Valued Functions, TVFs)是一种用户定义函数,它可以返回一个表。表值函数有两种类型:内联表值函数(Inline Table-Valued Function)和多语句表值函数(Multi-Statement Table-Valued Function)。下面分别介绍这两种类型的表值函数及其使…...
计算机网络之多路转接epoll
个人主页:C忠实粉丝 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 C忠实粉丝 原创 计算机网络之多路转接epoll 收录于专栏【计算机网络】 本专栏旨在分享学习计算机网络的一点学习笔记,欢迎大家在评论区交流讨论💌 目…...
BPMN与一般的流程图区别在那里?
1. 语义和标准性 BPMN(业务流程建模符号) 基于标准语义:BPMN是一种标准化的业务流程建模语言,拥有一套严谨的语义规范。它由国际对象管理组织(OMG)维护,定义了事件、活动、网关和流向等元素的确…...
内容与资讯API优质清单
作为开发者,拥有一套API合集是必不可少的。这个开发者必备的API合集汇集了各种实用的API资源,为你的开发工作提供了强大的支持!无论你是在构建网站、开发应用还是进行数据分析,这个合集都能满足你的需求。你可以通过这些免费API获…...
uniapp获取内容高度
获取内容高度 getNewsHieght(index) {uni.createSelectorQuery().select(.content_${index}).boundingClientRect(rect > {console.log(打印该盒子的元素, rect.height);swiperHeight.value rect.height// console.log(打印swiperHeight的数值,this.swiperHeight);}).exec…...
Unity局部和世界坐标系相互转换的实现原理
注:本篇是基于唐老师的学习视频做的一些理论实践,需要提前知道一些线性代数的基础知识,原视频链接: 8.数学基础知识学习说明_哔哩哔哩_bilibili 前期准备: 知识点①: Unity中需要遵守的设定:…...
数据结构(Java版)第六期:LinkedList与链表(一)
目录 一、链表 1.1. 链表的概念及结构 1.2. 链表的实现 专栏:数据结构(Java版) 个人主页:手握风云 一、链表 1.1. 链表的概念及结构 链表是⼀种物理存储结构上⾮连续存储结构,数据元素的逻辑顺序是通过链表中的引⽤链接次序实现的。与火车…...
浅谈文生图Stable Diffusion(SD)相关模型基础
1.U-Net模型基础 1.基础概念 UNet模型是一种基于卷积神经网络的图像分割算法,它采用了U型的网络结构,由编码器(下采样路径)和解码器(上采样路径)两部分组成。 编码器负责提取输入图像的特征,…...
7-10 函数和排序练习一
输入n个数(n<10),对其中的素数进行排序(剔除非素数),输出排序后的数列结果。 建议:编写若干函数,用以判断素数,以及对数组进行排序。 输入格式: 第一行是一个正整数t,表示测试的总数。 然后…...
【FFmpeg 教程 一】截图
本章使用 ffmpeg 实现观影中经常会用到的功能,截图。 以下给出两种方式。 课程需具备的基础能力:Python 1. 使用 subprocess 调用 FFmpeg 命令 import subprocess def extract_frame(video_path, output_image_path, timestamp"00:00:05")&qu…...
Python选择题训练工具:高效学习、答题回顾与音频朗读一站式体验
一、引言 随着人工智能技术的不断进步,传统的教学方式已经逐渐向智能化、互动化转变。在众多英语测试题型中,选择题作为一种高效的方式被广泛应用于各类培训与考试中。为了帮助学生高效学习与自测,本篇文章将采用Python编写一款基于 Python …...
【Python】使用Selenium 操作浏览器 自动化测试 记录
【自动化】Python SeleniumUtil 工具 开启开发者模式 自动安装油猴用户脚本等-CSDN博客文章浏览阅读389次。【自动化】Python SeleniumUtil 工具。https://blog.csdn.net/G971005287W/article/details/144565691?spm1001.2014.3001.5501【学习记录】浏览器指纹相关学习记录&am…...
汽车IVI中控开发入门及进阶(42):OpenVG
概览: OpenVG是一个无版权、跨平台的API,它为高级用户界面和矢量图形库(如SVG)提供了一个低级硬件加速接口。OpenVG主要针对需要便携式加速高质量矢量图形以获得引人注目的用户界面和文本的消费电子产品、手持设备、可穿戴设备和汽车设备,同时使硬件加速能够在非常低的功…...
两点间最短距离 - Dijkstra
一、汇总 算法场景说明参考BFS 树 无权图的搜索 标准BFS默认搜索一条最短路径 改造后可以输出所有最短路径 https://blog.csdn.net/m0_37145844/article/details/144534202DFS走迷宫主要利用回溯算法思想,不保证最短路径https://blog.csdn.net/m0_37145844/articl…...
0002__GPU
国内GPU公司主要包括以下几家: 摩尔线程:摩尔线程被誉为“中国版英伟达”,成立于2019年,由前英伟达全球副总裁张建中创立。该公司已获得425项授权专利,计划上市,目标估值高达1500亿元。摩尔线程的技术…...
StarRocks 排查单副本表
文章目录 StarRocks 排查单副本表方式1 查询元数据,检查分区级的副本数方式2 SHOW PARTITIONS命令查看 ReplicationNum修改副本数命令 StarRocks 排查单副本表 方式1 查询元数据,检查分区级的副本数 # 方式一 查询元数据,检查分区级的副本数…...
基于字节大模型的论文翻译(含免费源码)
基于字节大模型的论文翻译 源代码: 👏 star ✨ https://github.com/boots-coder/LLM-application 展示 项目简介 本项目是一个基于大语言模型(Large Language Model, LLM)的论文阅读与翻译辅助工具。它通过用户界面(…...
【原生js案例】ajax的简易封装实现后端数据交互
ajax是前端与后端数据库进行交互的最基础的工具,第三方的工具库比如jquery,axios都有对ajax进行第二次的封装,fecth是浏览器原生自带的功能,但是它与ajax还是有区别的,总结如下: ajax与fetch对比 实现效果 代码实现 …...
uniapp Native.js 调用安卓arr原生service
有问题,文中的内容不正确 最近搞了个uni小项目,一个定制的小平板,带一个nfc设备,厂家只给了一套安卓原生demo,头一次玩原生安卓,废了好半天劲打出来arr包,想镶进uniapp里,网上查了好…...
关于画火山图(by ggplot2)的一些总结和经验
愿武艺晴小朋友一定得每天都开心! 文献中常用经典的火山图,是展示差异表达基因的利器。每次测完转录组,做实验组和对照组的比较后,都会用到。 我自己也画了不算太多也不算太少的次数。然后最近画的时候忽然间意识到这个可视化方法我经常用,却没系统的整理过,一些tips散…...
组装一台电脑需要哪些硬件设备?点击了解
组装一台电脑是一个既有趣又实用的过程,我们可以根据自己的需求和预算来定制一台完全符合个人使用习惯的计算机。 一、核心部件 1、中央处理器(CPU) CPU是计算机的“大脑”,负责执行各种计算任务。它的性能直接影响到计算机的运…...
Mac M1使用pip3安装报错
1. Mac系统使用pip3安装组件的时候报”外部管理环境”错误: error: externally-managed-environment 2.解决办法 去掉这个提示 1、先查看当前python版本: python3 --version 2、查找EXTERNALLY-MANAGED 文件的位置(根据自己当前使用的pytho…...
在Linux系统安装配置 MySQL 和 hive,hive配置为远程模式
前提:已安装配置好了Hadoop环境,因为hive的底层是Hadoop 1 Mysql安装 搜索Centos7自带的mariadb rpm -qa|grep mariadb 卸载mariadb rpm -e mariadb-libs-5.5.64-1.el7.x86_64 --nodeps 再搜索一次看看是否还存在 rpm -qa|grep mariadb 安装mysql 创…...
亚信安全与方天股份达成战略合作,双向奔赴助力数字化转型
近日,亚信安全科技股份有限公司(以下简称“亚信安全”)正式与青岛方天科技股份有限公司(以下简称“方天股份”)签订合作框架协议。双方强强携手,在网络安全运营平台共建、信息化项目安全支撑、政企市场拓展…...
ubuntu镜像开荒ssh
直接unminimized deprecated me ubuntu 安装 ssh,用 service 启动 4o 在 Ubuntu 上安装并启动 SSH 服务,你可以按照以下步骤进行操作: 更新软件包列表: 首先,确保你的软件包列表是最新的。打开终端并运行以下命令&…...
前端yarn工具打包时网络连接问题排查与解决
最近线上前端打包时提示 “There appears to be trouble with your network connection”,以此文档记录下排查过程。 前端打包方式 docker启动临时容器打包,命令如下 docker run --rm -w /app -v pwd:/app alpine-node-common:v16.20-pro sh -c "…...
CCF-GESP 等级考试 C++ 真题解析目录
GESP C 一级 序号日期真题解析链接12023.03CCF-GESP 等级考试 2023年3月认证C一级真题解析22023.06CCF-GESP 等级考试 2023年6月认证C一级真题解析32023.09[CCF-GESP 等级考试 2023年9月认证C一级真题解析]42023.12[CCF-GESP 等级考试 2023年12月认证C一级真题解析]52024.03[C…...
如何使用 WebAssembly 扩展后端应用
1. WebAssembly 简介 随着互联网的发展,越来越多的应用借助 Javascript 转到了 Web 端,但人们也发现,随着移动互联网的兴起,需要把大量的应用迁移到手机端,随着手端的应用逻辑越来越复杂,Javascript 的解析…...
从DINO到DINOv2——自监督视觉Transformer的升级改进之路(基于ViT)
前言 之所以关注到DINOV2,原因在于我解读多个具身机器人模型时——发现他们的视觉基座都用的DINOV2,比如 rekepOpen-TeleVisionOpenVLACogACTOKAMI 不过,实话讲,DINO论文的可读性是真的不高,使得本次解读不易..总之…...
CCF-GESP 等级考试 2024年12月认证C++七级真题解析
2024年12月真题 一、单选题(每题2分,共30分) 正确答案:D 解析:考察字符类型和ASCII码值。 字符类型参与运算,是它所对应的ASCII码值在参与运算,运算结果为整数值。小写字母 b 的ASCII码为98&am…...
Qt之串口设计-线程实现(十二)
Qt开发 系列文章 - Serial-port(十二) 目录 前言 一、SerialPort 二、实现方式 1.创建类 2.相关功能函数 3.用户使用 4.效果演示 5.拓展应用-实时刷新 总结 前言 Qt作为一个跨平台的应用程序开发框架,在串口编程方面提供了方便易用…...
20241217使用M6000显卡在WIN10下跑whisper来识别中英文字幕
20241217使用M6000显卡在WIN10下跑whisper来识别中英文字幕 2024/12/17 17:21 缘起,最近需要识别法国电影《地下铁》的法语字幕,使用 字幕小工具V1.2【whisper套壳/GUI封装了】 无效。 那就是直接使用最原始的whisper来干了。 当你重装WIN10的时候&#…...
基于 uniapp 开发 android 播放 webrtc 流
一、播放rtsp协议流 如果 webrtc 流以 rtsp 协议返回,流地址如:rtsp://127.0.0.1:5115/session.mpg,uniapp的 <video> 编译到android上直接就能播放,但通常会有2-3秒的延迟。 二、播放webrtc协议流 如果 webrtc 流以 webrt…...
Java反射学习(3)(“反射“机制获取成员变量及详细信息(Field类))
目录 一、基本引言。 (1)基本内容回顾。 (2)本篇博客的核心内容-基本介绍。 二、Java中使用"反射"机制获取成员变量及内部的详细信息。 (1)"反射"机制获取成员变量及详细信息的基本概念…...
Flutter组件————AppBar
AppBar 是 Flutter 中用于创建应用程序顶部栏的组件,它遵循 Material Design 规范。 参数: 参数名称类型描述titleWidget设置 AppBar 中的标题文本或自定义标题小部件。automaticallyImplyLeadingbool决定是否自动添加返回按钮(如果页面不是…...
LabVIEW在电液比例控制与伺服控制中的应用
LabVIEW作为一种图形化编程环境,广泛应用于各类控制系统中,包括电液比例控制和伺服控制领域。在这些高精度、高动态要求的控制系统中,LabVIEW的优势尤为突出。以下从多个角度探讨其应用与优势: 1. 灵活的控制架构 LabVIEW为电…...