springboot中Controller內文件上傳到本地以及阿里云

?上傳文件的基本操作

<form action="/upload" method="post" enctype="multipart/form-data">  <h1>登錄</h1>  姓名:<input type="text" name="username" required><br>  年齡:<input type="text" name="age" required><br>  頭像:<input type="file" name="file" required><br>  <input type="submit" value="提交">  
</form>  
// Java接收前端發來的文件@RestController
public class UploadController {private static final ch.qos.logback.classic.Logger log = (Logger) LoggerFactory.getLogger(UploadController.class);@PostMapping(path = "/upload")public Result upload(String username, Integer age, MultipartFile file){log.info("接收參數:" + username + age + file);return Result.success();}
}

?注意:springboot項目啟動后,打開這個index.html的頁面要輸入:localhost:8080/index.html

接下來通過斷點調試獲取查看前端發送過來的文件?

?文件的”到此一游“該文件所在的路徑的文件夾是個臨時文件夾,運行完畢后這個文件夾里的內容清空

?前端上傳文件本地存儲

@PostMapping("/upload")public Result upload(String name, Integer age, MultipartFile file) throws IOException {// 記錄接收到的參數,包括姓名、年齡和文件log.info("接收參數: {}, {}, {}", name, age, file);// 獲取上傳文件的原始文件名String originalFilename = file.getOriginalFilename();// 將文件保存到指定路徑(D:/images/)并命名為原始文件名file.transferTo(new File( "D:/idea/javacode/web/Getdata/" + originalFilename));// 返回成功結果return Result.success();}

文件上傳還存在一個要考慮的問題:如果兩次提交的是不一樣的文件,但是文件名稱一樣,那么第二次提交的圖片會把第一次提交的文件給替換(覆蓋)因此可以使用UUID命名來解決。

生成UUID

import java.util.UUID;  public class UUIDExample {  public static void main(String[] args) {  // 生成一個隨機UUID  UUID uuid = UUID.randomUUID();  // 輸出UUID  System.out.println("生成的UUID: " + uuid.toString());  }  
}

使用UUID解決以上問題
?

@PostMapping("/upload")  
public Result upload(String name, Integer age, MultipartFile file) throws IOException {  // 記錄接收到的參數,包括姓名、年齡和文件  log.info("接收參數: {}, {}, {}", name, age, file);  // 獲取上傳文件的原始文件名,例如 "1.jpg" 或 "22.2.2.2.png"  String originalFilename = file.getOriginalFilename();  // 獲取文件擴展名,從最后一個點后開始截取  String extension = originalFilename.substring(originalFilename.lastIndexOf("."));  // 生成新的文件名,使用UUID并加上文件擴展名  String newFileName = UUID.randomUUID().toString() + extension;  // 將文件保存到指定路徑(D:/images/)并命名為新的文件名  file.transferTo(new File("D:/images/" + newFileName));  // 返回成功結果  return Result.success();  
}
file.transferTo(new File("D:/idea/javacode/web/Getdata/" + newFileName));

這個代碼的路徑最后一定要寫個“/”,使得文件保存在那個文件夾下。

上傳文件大小限制

默認上傳文件的最大大小為1MB,超過該大小需要在配置文件配置

servlet:  multipart:  
# 最大單個文件大小  max-file-size: 10MB  
# 最大請求大小(包括所有文件和表單數據)  max-request-size: 100MB

阿里云OSS

阿里云對象存儲oss(object Storage Service),是一款海量、安全、低成本、高可靠的云存儲服務。使用oss

您可以通過網絡隨時存儲和調用包括文本、圖片、音頻和視頻等在內的各種文件。

?具體怎么配看:視頻icon-default.png?t=O83Ahttps://www.bilibili.com/video/BV1yGydYEE3H?spm_id_from=333.788.videopod.episodes&vd_source=3c46a0d84476a55380be0c2ddd012af1&p=106

配置好相關密鑰等配置后,創建bucket。接下來可以通過Java代碼將自己電腦本地的文件上傳到阿里云。

添加好下面的依賴

<dependency><groupId>com.aliyun.oss</groupId><artifactId>aliyun-sdk-oss</artifactId><version>3.17.4</version>
</dependency><dependency><groupId>javax.xml.bind</groupId><artifactId>jaxb-api</artifactId><version>2.3.1</version>
</dependency>
<dependency><groupId>javax.activation</groupId><artifactId>activation</artifactId><version>1.1.1</version>
</dependency>
<!-- no more than 2.3.3-->
<dependency><groupId>org.glassfish.jaxb</groupId><artifactId>jaxb-runtime</artifactId><version>2.3.3</version>
</dependency>

?具體的上傳文件的代碼

 public static void main(String[] args) throws com.aliyuncs.exceptions.ClientException {/*** 基礎配置:連接服務并驗證個人身份*/// Endpoint以華東1(杭州)為例,其它Region請按實際情況填寫。String endpoint = "https://oss-cn-shenzhen.aliyuncs.com";// 從環境變量中獲取訪問憑證。運行本代碼示例之前,請確保已設置環境變量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();// 填寫Bucket名稱,例如examplebucket。String bucketName = "q-buckets";/*** 配置具體文件上傳信息*/// 填寫Object完整路徑,完整路徑中不能包含Bucket名稱,例如exampledir/exampleobject.txt。String objectName = "ph.webp"; // 可以修改名字// 填寫本地文件的完整路徑,例如D:\\localpath\\examplefile.txt。// 如果未指定本地路徑,則默認從示例程序所屬項目對應本地路徑中上傳文件。String filePath= "D:\\Mycode\\webcode\\imag\\nu.webp";// 創建OSSClient實例。OSS ossClient = new OSSClientBuilder().build(endpoint, credentialsProvider);try {// 創建PutObjectRequest對象。PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, objectName, new File(filePath));// 如果需要上傳時設置存儲類型和訪問權限,請參考以下示例代碼。// ObjectMetadata metadata = new ObjectMetadata();// metadata.setHeader(OSSHeaders.OSS_STORAGE_CLASS, StorageClass.Standard.toString());// metadata.setObjectAcl(CannedAccessControlList.Private);// putObjectRequest.setMetadata(metadata);// 上傳文件。PutObjectResult result = ossClient.putObject(putObjectRequest);} catch (OSSException oe) {System.out.println("Caught an OSSException, which means your request made it to OSS, "+ "but was rejected with an error response for some reason.");System.out.println("Error Message:" + oe.getErrorMessage());System.out.println("Error Code:" + oe.getErrorCode());System.out.println("Request ID:" + oe.getRequestId());System.out.println("Host ID:" + oe.getHostId());} catch (ClientException ce) {System.out.println("Caught an ClientException, which means the client encountered "+ "a serious internal problem while trying to communicate with OSS, "+ "such as not being able to access the network.");System.out.println("Error Message:" + ce.getMessage());} finally {if (ossClient != null) {ossClient.shutdown();}}}

這樣就可以在自己阿里云的bucket里面看到上傳的文件?

參考:后端之路?

文件上傳操作整合為工具類并在Controller中使用

具體代碼如下

@Component // 方便依賴注入
public class AliyunOSSOperation {  // 指定阿里云OSS的服務地址,這里是深圳區域的地址  private String endpoint = "https://oss-cn-shenzhen.aliyuncs.com";  // 指定要上傳到的存儲桶名稱  private String bucketName = "lwq-buckets";   // 指定阿里云的區域,這里是深圳區域  private String region = "cn-shenzhen";   /**  * 上傳文件到阿里云OSS  * @param content 文件的字節數組內容  * @param originalFilename 原始文件名,用于生成新的文件名  * @return 上傳后文件的訪問路徑  * @throws Exception 可能拋出的異常  */  public String upload(byte[] content, String originalFilename) throws Exception {  // 從環境變量中獲取訪問密鑰,確保在運行代碼前設置環境變量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET  EnvironmentVariableCredentialsProvider credentialsProvider =   CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();  // 獲取object對象路徑,例如2024/06/21.png。Object類型中不能包含Bucket名稱  String dir = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyy/MM"));  // 生成一個新的文件名,使用UUID確保唯一性,并保留原始文件的擴展名  String newFileName = UUID.randomUUID() + originalFilename.substring(originalFilename.lastIndexOf("."));  String objectName = dir + "/" + newFileName; // 生成完整的對象名稱  // 創建OSSClient實例  ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();  clientBuilderConfiguration.setSignatureVersion(SignVersion.V4); // 設置簽名版本為V4  // 使用OSSClientBuilder創建OSS客戶端實例,配置包括端點、憑證提供者、客戶端配置和區域  OSS ossClient = OSSClientBuilder.create()  .endpoint(endpoint)  .credentialsProvider(credentialsProvider)  .clientConfiguration(clientBuilderConfiguration)  .region(region)  .build();  try {  // 上傳文件內容到指定的存儲桶和對象路徑  ossClient.putObject(bucketName, objectName, new ByteArrayInputStream(content));  } finally {  // 確保無論上傳是否成功,都會關閉OSS客戶端  ossClient.shutdown();  }  // 生成并返回文件的完整訪問路徑  return endpoint.split("//")[0] + "//" + bucketName + "." + endpoint.split("//")[1] + "/" + objectName;  }  
}

使用該類?

@Autowired // 自動注入AliyunOSSOperator實例  
private AliyunOSSOperator aliyunOSSOperator;  @PostMapping("/upload") // 定義一個POST請求處理方法,映射到/upload路徑  
public Result upload(MultipartFile file) throws Exception {  // 記錄上傳文件的原始文件名到日志  log.info("文件上傳: {}", file.getOriginalFilename());  // 調用aliyunOSSOperator的upload方法,將文件字節和文件名上傳到OSS  String url = aliyunOSSOperator.upload(file.getBytes(), file.getOriginalFilename());  // 記錄文件上傳后返回的URL到日志  log.info("文件上傳OSS, url: {}", url);  // 返回上傳結果,包含文件的訪問URL  return Result.success(url);  
}

這樣上傳到阿里云的文件以年月劃分了文件夾?

參數配置進一步優化

  • 指將一些需要靈活變化的參數,配置在配置文件中,然后通過 @Value 注解來注入外部配置的屬性。
  • aliyun:  oss:  endpoint: https://oss-cn-beijing.aliyuncs.com  bucketName: java-ai  region: cn-beijing

    以上配置信息配置在yml文件中

  •     @Value("${aliyun.oss.endpoint}")  private String endpoint;  @Value("${aliyun.oss.bucketName}")  private String bucketName;  @Value("${aliyun.oss.region}")  private String region;  

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/63510.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/63510.shtml
英文地址,請注明出處:http://en.pswp.cn/web/63510.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

智慧城市工程:相關學點、優勢、未來發展

目錄 相關學點&#xff1a; 智慧城市的優勢 挑戰與未來發展 智慧城市工程是利用現代信息技術和數據分析手段&#xff0c;提升城市管理和服務水平&#xff0c;實現城市運行的智能化、便捷化和高效化的一種新型城市發展模式。智慧城市通過整合物聯網&#xff08;IoT&#xff0…

授權模型MAC

MAC&#xff08;Mandatory Access Control&#xff09;是一種授權模型&#xff0c;用于實現對系統資源訪問的強制控制。在MAC模型中&#xff0c;授權是基于預先定義的安全策略&#xff0c;且該策略由系統管理員來配置和管理。 在MAC模型中&#xff0c;每個用戶和每個資源都被賦…

看板工具助力餐飲與酒店行業實現數字化轉型,提升管理與運營效率

在餐飲與酒店行業&#xff0c;服務質量和客戶體驗是衡量企業成功的關鍵因素。隨著客戶需求的不斷多樣化以及市場競爭的加劇&#xff0c;傳統的管理模式逐漸難以滿足高效運營的需求。尤其在高峰期&#xff0c;如何優化內部流程、提高服務效率和響應速度&#xff0c;成為了許多餐…

2024年CCF 非專業級軟件能力認證CSP-J/S 第二輪( 提高組) 染色(color)

完整題目內容可前往下方鏈接&#xff1a; 染色&#xff08;color&#xff09;_C_嗨信奧-玩嗨信息奧林匹克競賽-少兒編程題庫學習中心https://www.hixinao.com/tiku/cpp/show-4118.html 若需更多真題&#xff0c;可前往題庫中心查找&#xff0c;題庫中心涵蓋白名單賽事真題&am…

OpenIPC開源FPV之Adaptive-Link天空端代碼解析

OpenIPC開源FPV之Adaptive-Link天空端代碼解析 1. 源由2. 框架代碼2.1 消息機制2.2 超時機制 3. 報文處理3.1 special報文3.2 普通報文 4. 工作流程4.1 Profile 競選4.2 Profile 研判4.2.1 回退策略4.2.2 保持策略 4.3 Profile 應用 5. 總結6. 參考資料7. 補充資料7.1 RSSI 和 …

labelme標簽批量轉換數據集json_to_dataset

文章目錄 labelme標簽批量轉換數據集json_to_dataset轉換原理單張圖片轉換多張圖片批量轉換bat腳本循環法 標注圖片提取標注圖片轉單通道 labelme標簽批量轉換數據集json_to_dataset 轉自labelme批量制作數據集教程。 轉換原理 在安裝了labelme的虛擬環境中有一個labelme_js…

Apache Kylin最簡單的解析、了解

官網&#xff1a;Overview | Apache Kylin 一、Apache Kylin是什么&#xff1f; 由中國團隊研發具有濃厚的中國韻味&#xff0c;使用神獸麒麟&#xff08;kylin&#xff09;為名 的一個OLAP多維數據分析引擎:&#xff08;據官方給出的數據&#xff09; 亞秒級響應&#xff…

01云計算HCIA學習筆記

筆者今年7月底考取了華為云計算方向的HCIE認證&#xff0c;回顧從IA到IE的學習和項目實戰&#xff0c;想整合和分享自己的學習歷程&#xff0c;歡迎志同道合的朋友們一起討論&#xff01; 第一章 云計算概述 ICT&#xff1a;ICT是世界電信協會在2001年的全球會議中提出的一個綜…

php生成圖片

前提 開啟dg2庫 去掉前面的;注釋&#xff0c;有的可能會帶.dll后綴影響不大 extensiongd2代碼 <?php $file imagecreate(100,50); //先生成圖片資源$color imagecolorallocate($file,255,255,255); //白色$c imagecolorallocate($file,0,100,255);imagefill($file,0…

免費GIS工具箱:輕松將glb文件轉換成3DTiles文件

在GIS地理信息系統領域&#xff0c;GLB文件作為GLTF文件的二進制版本&#xff0c;主要用于3D模型數據的存儲和展示。然而&#xff0c;GLB文件的使用頻率相對較低&#xff0c;這是因為GIS系統主要處理的是地理空間數據&#xff0c;如地圖、地形、地貌、植被、水系等&#xff0c;…

為何VisualRules更適合技術人員使用

什么是規則引擎 規則引擎是一種軟件組件&#xff0c;它允許將業務規則從應用程序的核心代碼中分離出來&#xff0c;以一種更加靈活、易于管理和維護的方式來定義、存儲和執行這些規則。簡單來說&#xff0c;它就像是一個專門處理規則的 “大腦”&#xff0c;可以根據預先設定的…

prometheus 搭建監控

prometheus 下載 prometheus-3.0.0.linux-amd64.tar.gztar -zxvf prometheus-3.0.0.linux-amd64.tar.gzmv prometheus-3.0.0.linux-amd64 prometheus-3vim /etc/systemd/system/prometheus.serviceprometheus.service [Unit] DescriptionPrometheus Wantsnetwork-online.t…

游戲何如防抓包

游戲抓包是指在游戲中&#xff0c;通過抓包工具捕獲和分析游戲客戶端與服務器之間傳輸的封包數據的過程。抓包工具可實現攔截、篡改、重發、丟棄游戲的上下行數據包&#xff0c;市面上常見的抓包工具有WPE、Fiddler和Charles Proxy等。 抓包工具有兩種實現方式&#xff0c;一類…

RestTemplate實時接收Chunked編碼傳輸的HTTP Response

學習調用AI接口的時候&#xff0c;流式響應都是使用的 Transfer-Encoding: chunked&#xff0c;圖方便想用RestTemplate&#xff0c;但是平時用到的都是直接返回響應對象的類型。使用bing搜索到一種方式&#xff0c;使用下面的代碼來讀取&#xff0c;于是掉這個坑里了&#xff…

request.setAttribute()和session.setAttribute()的區別

request.setAttribute() 作用&#xff1a;request.setAttribute()是在一次請求內共享數據 解釋&#xff1a;例如將一個數據保存request域中&#xff0c;然后請求轉發至前端頁面&#xff0c;則數據轉發至前端頁面后會被自動銷毀。簡單點說就是&#xff0c;數據只能用一次就不能…

Java中的Consumer接口應該如何使用(通俗易懂圖解)

應用場景&#xff1a; 第一次程序員A寫好了個基礎的遍歷方法&#xff1a; public class Demo1 {public static void main(String[] args) {//假設main方法為程序員B寫的,此時需要去調用A寫好的一個遍歷方法//1.如果此時B突然發現想將字符串以小寫的形式打印出來&#xff0c;則…

【常微分方程講義1.1】方程的種類發展與完備

方程在數學歷史中不斷發展&#xff0c;逐步趨于完備。從最初的簡單代數方程到包含函數、算子甚至泛函的更復雜方程&#xff0c;數學家通過不斷的擴展和深化&#xff0c;逐漸建立起更為豐富和多元的方程類型體系。方程的種類之所以不斷演變&#xff0c;部分是因為解決實際問題的…

通過移除 -march=native 解決 Ubuntu 20.04 程序運行“段錯誤 (核心已轉儲)”問題的詳解

通過移除 -marchnative 解決 Ubuntu 20.04 程序運行“段錯誤 (核心已轉儲)”問題的詳解 在Ubuntu 20.04系統中&#xff0c;開發和編譯C/C程序時&#xff0c;常見的編譯選項可能會影響程序的穩定性和兼容性。特別是在使用CMake構建系統時&#xff0c;某些編譯標志可能導致程序在…

Linux下學【MySQL】表的必備操作( 配實操圖和SQL語句)

緒論? “Patience is key in life &#xff08;耐心是生活的關鍵&#xff09;”。本章是MySQL中非常重要且基礎的知識----對表的操作。再數據庫中表是存儲數據的容器&#xff0c;我們通過將數據填寫在表中&#xff0c;從而再從表中拿取出來使用&#xff0c;本章主要講到表的增…

深度學習之目標檢測篇——殘差網絡與FPN結合

特征金字塔多尺度融合特征金字塔的網絡原理 這里是基于resnet網絡與Fpn做的結合&#xff0c;主要把resnet中的特征層利用FPN的思想一起結合&#xff0c;實現resnet_fpn。增強目標檢測backone的有效性。代碼實現如下&#xff1a; import torch from torch import Tensor from c…