阿里云對象存儲OSS的使用

文章目錄

  • 注冊阿里OSS
    • 注冊并登錄阿里云賬號
    • 開通對象存儲OSS
    • 創建Bucket
    • 修改權限
    • 創建AccessKey
    • 全局存儲到你的計算機(可以跳過)
    • 查看官方文檔(可以跳過)
  • SSM使用
    • 引入依賴
    • 在spring-mvc.xml中加入配置
    • 創建上傳工具類AliOssUtil
    • 響應工具類ResultJSON
    • 編寫controller
  • 編寫前端代碼使用ElmentUI
    • 自動上傳
      • 代碼編寫
      • 結果如下演示
    • 手動上傳
      • 前端代碼編寫
      • 后端代碼編寫
      • 結果演示如下

注冊阿里OSS

注冊并登錄阿里云賬號

地址如下:https://www.aliyun.com
注冊后使用支付寶登錄

開通對象存儲OSS

這個很便宜,我10塊錢幾個月才用1分錢。不用擔心過期收費過高。

找到產品。
在這里插入圖片描述

點擊免費試用
在這里插入圖片描述

這個頁面往下滑動,找到下圖的然后點擊立即試用。

在這里插入圖片描述
勾選協議,立即試用。
在這里插入圖片描述
點擊管理試用
在這里插入圖片描述

創建Bucket

繼續上面的操作

點擊三個橫杠
在這里插入圖片描述

搜索對象存儲oss
在這里插入圖片描述
創建Bucket
在這里插入圖片描述
寫入項目名稱,其他不用管。
在這里插入圖片描述
點擊我知道了,確認創建
在這里插入圖片描述
點擊進入Bucket
在這里插入圖片描述
如下圖
在這里插入圖片描述

修改權限

點擊權限控制
在這里插入圖片描述
將上面的話復制到下面然后點擊確定
在這里插入圖片描述
點擊設置
在這里插入圖片描述
點擊公共讀
在這里插入圖片描述
點擊繼續修改
在這里插入圖片描述
保存
在這里插入圖片描述
下面的權限變成公共讀即可

在這里插入圖片描述

創建AccessKey

右上角頭像,點擊AccessKey。
在這里插入圖片描述
勾選并點擊繼續
在這里插入圖片描述

點擊創建AccessKey,
在這里插入圖片描述
選一種方式驗證
在這里插入圖片描述

注意:一定一定要保存好,丟了只能重新創建無法找回。
在這里插入圖片描述

全局存儲到你的計算機(可以跳過)

如果你害怕丟失
以管理員身份打開CMD命令行,執行如下命令,配置系統的環境變量。

set OSS_ACCESS_KEY_ID=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
set OSS_ACCESS_KEY_SECRET=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

注意:將上述的ACCESS_KEY_ID 與 ACCESS_KEY_SECRET 的值一定一定一定一定一定一定要替換成自己的 。

執行如下命令,讓更改生效。

setx OSS_ACCESS_KEY_ID "%OSS_ACCESS_KEY_ID%"
setx OSS_ACCESS_KEY_SECRET "%OSS_ACCESS_KEY_SECRET%"

執行如下命令,驗證環境變量是否生效。

echo %OSS_ACCESS_KEY_ID%
echo %OSS_ACCESS_KEY_SECRET%

查看官方文檔(可以跳過)

阿里云oss 對象存儲服務的準備工作我們已經完成了,接下來我們就來完成第二步操作:參照官方所提供的sdk示例來編寫入門程序。
首先我們需要來打開阿里云OSS的官方文檔,在官方文檔中找到 SDK 的示例代碼:
在這里插入圖片描述

在這里插入圖片描述

SSM使用

引入依賴

<!--阿里云OSS依賴--><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><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>

在spring-mvc.xml中加入配置

<!-- 配置 MultipartResolver 用于文件上傳 --><bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"><!-- 設置最大上傳文件大小 --><property name="maxUploadSize" value="10485760"/> <!-- 10MB --><property name="maxInMemorySize" value="4096"/><property name="defaultEncoding" value="UTF-8"/></bean>

創建上傳工具類AliOssUtil

package com.Teenage_education_network.utils;import com.aliyun.oss.ClientException;
import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.OSSException;import java.io.InputStream;public class AliOssUtil {private static final String ENDPOINT = "https://oss-cn-beijing.aliyuncs.com";private static final String ACCESS_KEY_ID = "你的id";private static final String SECRET_ACCESS_KEY = "你的秘鑰";private static final String BUCKET_NAME = "項目名";/** uploadFile方法* objectName:文件名稱比如 "YEjdihp893bif1.jpg"* inputStream:文件流,用于讀取文件比如,D:\Users\Administrator\Desktop\YEjdihp893bif1.jpg* *///上傳文件,返回文件的公網訪問地址public static String uploadFile(String objectName, InputStream inputStream){// 創建OSSClient實例。OSS ossClient = new OSSClientBuilder().build(ENDPOINT,ACCESS_KEY_ID,SECRET_ACCESS_KEY);//公文訪問地址String url = "";try {// 創建存儲空間。ossClient.createBucket(BUCKET_NAME);ossClient.putObject(BUCKET_NAME, objectName, inputStream);// 這里是返回阿里云的url地址url = "https://"+BUCKET_NAME+"."+ENDPOINT.substring(ENDPOINT.lastIndexOf("/")+1)+"/"+objectName;} 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();}}return url;}
}

響應工具類ResultJSON

package com.hsh.pojo.tdo;import java.io.Serializable;/*** @Author: wzy* @Date: 2024/11/13 11:03* @Description: 返回結果類*/
public class ResultJSON<T> implements Serializable {private Integer code;private String msg;private T data;public ResultJSON(Integer code, String msg, T data) {this.code = code;this.msg = msg;this.data = data;}/*** 操作成功或者失敗* @param c 受影響行數* @return 當前傳入的受影響行數>0則返回成功,否則返回失敗*/public static  ResultJSON successORerror(int c){return c>0?new ResultJSON(200,"操作成功",c):new ResultJSON(400,"操作失敗",c);}public static ResultJSON success(){return new ResultJSON(200,"操作成功",null);}public static ResultJSON success(String msg){return new ResultJSON(200,msg,null);}public static <T> ResultJSON success(T data){return new ResultJSON(200,"操作成功",data);}public static ResultJSON success(Integer code,String msg){return new ResultJSON(code,msg,null);}public static <T> ResultJSON success(String msg,T data){return new ResultJSON(200,msg,data);}public static <T> ResultJSON success(Integer code,String msg,T data){return new ResultJSON(code,msg,data);}public static ResultJSON error(){return new ResultJSON(500,"操作失敗",null);}public static ResultJSON error(String msg){return new ResultJSON(500,msg,null);}public static ResultJSON error(Integer code,String msg){return new ResultJSON(code,msg,null);}public T getData() {return data;}public void setData(T data) {this.data = data;}public Integer getCode() {return code;}public void setCode(Integer code) {this.code = code;}public String getMsg() {return msg;}public void setMsg(String msg) {this.msg = msg;}
}

編寫controller

package com.hsh.controller;import com.hsh.pojo.tdo.ResultJSON;
import com.hsh.utils.AliOssUtil;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;import java.io.IOException;
import java.util.UUID;/*** @author xrkhy* @date 2025/9/6 19:05* @description*/@RestController
@RequestMapping("/upload")
public class UploadController {// 本次請求通過elementPlus的el-upload組件上傳圖片,通過el-upload組件的屬性發起請求// 前端上傳路徑action="/api/upload/imgUpload" 要和后端一致 這里的/api是前端的反向代理的標識// 前端的name="img" 是這里的形參名// 前端的請求頭添加token  :headers="{'Authorization':tokenStore.token}"@PostMapping("/imgUpload")public ResultJSON<String> imgUpload(@RequestParam("img") MultipartFile img) throws IOException {System.out.println(img);if (img == null || img.isEmpty()) {// 處理文件為空的情況return ResultJSON.error("文件不能為空");}String originalFilename = img.getOriginalFilename();// 生成新的唯一的文件名String fileNmae = UUID.randomUUID().toString() + originalFilename.substring(originalFilename.lastIndexOf("."));String url = AliOssUtil.uploadFile(fileNmae, img.getInputStream());System.out.println(url);return ResultJSON.success("添加成功",url);}
}

編寫前端代碼使用ElmentUI

自動上傳

代碼編寫

<template><el-form:model="productForm"label-width="120px"label-position="right"><!-- 用戶基礎信息 --><el-form-item label="商品名稱" prop="productName"><el-input v-model="productForm.productName"></el-input></el-form-item><el-form-item label="封面圖片"><!-- :auto-upload 設置是否自動上傳 true自動上傳 --><!-- action為你的請求路徑:你要替換為你的上傳API地址 --><!-- name: 上傳的文件字段名 (也就是后端的參數 我這里是img)后端的接收參數如下就是我上面寫的UploadControllerpublic ResultJSON<String> imgUpload(@RequestParam("img") MultipartFile img){}--><!-- :on-success="handleAvatarSuccess" 上傳成功回調 --><!-- :before-upload="beforeAvatarUpload"上傳前校驗 --><!--  list-type="picture-card" 文件列表的類型 這里不需要因為已經有<i class="el-icon-plus" v-if="!productForm.imageUrl"></i>代替了--><!-- :show-file-list="false" 是否顯示已上傳文件列表 --><!-- 除了上面還可以設置響應頭,配置如下:headers="{'Authorization':tokenStore.token}"--><el-upload:auto-upload="true"action="http://localhost:8080/upload/imgUpload"name="img":on-success="handleAvatarSuccess":before-upload="beforeAvatarUpload":show-file-list="false"><!-- v-if="!productForm.imageUrl" 是如果上傳成功這個+圖標(<i class="el-icon-plus"></i>)上傳的提示就不顯示了  --><istyle="font-size: 20px; border: 1px solid #ccc; padding: 20px"class="el-icon-plus"v-if="!productForm.imageUrl"></i><img style="width: 100px" v-else :src="productForm.imageUrl" /></el-upload></el-form-item><el-form-item label="商品價格" prop="productPrice"><el-input-numberv-model="productForm.productPrice":precision="2":step="0.01"></el-input-number></el-form-item><el-form-item label="商品庫存" prop="productStock"><el-input-numberv-model="productForm.productStock"label="描述文字"></el-input-number></el-form-item><!-- 操作按鈕 --><el-form-item><el-button type="primary" @click="submitForm">提交</el-button><el-button @click="resetForm">重置</el-button></el-form-item></el-form>
</template><script>
export default {data() {return {productForm: {productId: null,productName: "",imageUrl: "",productPrice: "",productStock: ""},}}methods: {// 上傳成功后的回調handleAvatarSuccess(res, file) {this.productForm.imageUrl = res.data;},// 上傳前的校驗beforeAvatarUpload(file) {const isJPG = file.type === "image/jpeg" || file.type === "image/png";const isLt2M = file.size / 1024 / 1024 < 2;if (!isJPG) {this.$message.error("上傳頭像圖片只能是 JPG 或 PNG 格式!");}if (!isLt2M) {this.$message.error("上傳頭像圖片大小不能超過 2MB!");}return isJPG && isLt2M;},submitForm() {console.log("提交的數據:", this.formData);// 這里在發起請求},}
}
</script>

結果如下演示

在這里插入圖片描述
上面數據確實是拿到了,此時在點擊提交發送。
在這里插入圖片描述

手動上傳

前端代碼編寫

<template><div><h1>圖片手動提交</h1><el-form:model="productForm"style="width: 500px"label-width="120px"label-position="right"><!-- 用戶基礎信息 --><el-form-item label="商品名稱" prop="productName"><el-input v-model="productForm.productName"></el-input></el-form-item><el-form-item label="封面圖片"><!-- :auto-upload 設置是否自動上傳 true自動上傳 --><!-- action為你的請求路徑:你要替換為你的上傳API地址 --><!--  list-type="picture-card" 文件列表的類型 這里不需要因為已經有<i class="el-icon-plus" v-if="!productForm.imageUrl"></i>代替了--><!-- :show-file-list="false" 是否顯示已上傳文件列表 這里關閉 --><!-- v-if="!productForm.imageUrl" 是如果上傳成功這個+圖標(<i class="el-icon-plus"></i>)上傳的提示就不顯示了 --><el-upload:auto-upload="false"action="#":show-file-list="false":on-change="handleImgChange"><istyle="font-size: 20px; border: 1px solid #ccc; padding: 20px"class="el-icon-plus"v-if="!productForm.imageUrl"></i><img style="width: 100px" v-else :src="productForm.imageUrl" /></el-upload><!-- v-if="productForm.imageUrl" 如果圖片不存在 img不顯示 --><!-- <img v-if="imgURL" :src="imgURL" /> --></el-form-item><el-form-item label="商品價格" prop="productPrice"><el-input-numberv-model="productForm.productPrice":precision="2":step="0.01"></el-input-number></el-form-item><el-form-item label="商品庫存" prop="productStock"><el-input-numberv-model="productForm.productStock"label="描述文字"></el-input-number></el-form-item><!-- 操作按鈕 --><el-form-item><el-button type="primary" @click="submitForm">提交</el-button></el-form-item></el-form></div>
</template><script>
import axios from "axios";export default {name: "ImageUpload",data() {return {// 表單數據// 注意這里表單不能有字段為null,否則會報錯// 比如productId: null, 發送給后端報錯productForm: {productId: "",productName: "",imageUrl: "",productPrice: "",productStock: "",imgUrlFile: ""}};},methods: {// handleFileChange(file, fileList) {//   this.fileList = fileList;// },// 提交前實現封面圖片預覽handleImgChange(uploadFile) {// 預覽圖片// this.imgUrl = URL.createObjectURL(uploadFile.raw);this.productForm.imageUrl = URL.createObjectURL(uploadFile.raw);console.log(this.productForm.imageUrl);this.productForm.imgUrlFile = uploadFile.raw;// this.productForm.imageUrl = uploadFile.raw;},async submitForm() {const formData = new FormData();// 追加其他表單字段// 遍歷 productForm 對象的屬性for (const key in this.productForm) {// 將每個屬性和值添加到 FormData 中formData.append(key, this.productForm[key]);}// 追加文件字段formData.append("file", this.imgUrlFile);this.clgFromData(formData);const res = await axios.post("http://localhost:8080/product/addProductWithImg",formData// 下面的headers可以不,會自動識別是json還是formdata// {//   headers: {//     "Content-Type": "multipart/form-data"//   }// });console.log(res);},clgFromData(formData) {for (let pair of formData.entries()) {console.log(pair[0] + ", " + pair[1]);}}}
};
</script><style scoped></style>

后端代碼編寫

package com.hsh.controller;import com.hsh.pojo.Product;
import com.hsh.pojo.tdo.ResultJSON;
import com.hsh.service.ProductService;
import com.hsh.utils.AliOssUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;import java.io.IOException;
import java.util.List;
import java.util.UUID;@RestController
@RequestMapping("/product")
@CrossOrigin(origins = "http://localhost:8081")
public class ProductController {@AutowiredProductService productService;@PostMapping("/addProduct")public ResultJSON addProduct(@RequestBody Product product){System.out.println("product = " + product);return productService.addProduct(product);}// 注意 傳入的product對象的屬性不能是 null 也不能是 MultipartFile,否則報400的錯誤// 注意:java的product對象中,沒有imgUrlFile屬性。// 前端傳入的product對象中,imgUrlFile屬性是MultipartFile類型。@PostMapping("/addProductWithImg")public ResultJSON<Product> findProductById(@ModelAttribute Product product,@RequestParam(value = "imgUrlFile",required = false) MultipartFile imgUrlFile) throws IOException {System.out.println("product = " + product);System.out.println("imgFile = " + imgUrlFile);if (imgUrlFile == null || imgUrlFile.isEmpty()) {// 處理文件為空的情況return ResultJSON.error("文件不能為空");}String originalFilename = imgUrlFile.getOriginalFilename();// 生成新的唯一的文件名String fileNmae = UUID.randomUUID().toString() + originalFilename.substring(originalFilename.lastIndexOf("."));String url = AliOssUtil.uploadFile(fileNmae, imgUrlFile.getInputStream());System.out.println(url);product.setImageUrl(url);return productService.addProduct(product);}}

結果演示如下

在這里插入圖片描述

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

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

相關文章

香港云主機常見使用問題匯總

本文主要為初次或正在接觸香港云主機的用戶介紹&#xff0c;對于香港云服務器的一些問題進行解答&#xff0c;幫助用戶更好的了解香港云主機&#xff0c;熟悉香港云主機。1.香港云主機是否需要備案?香港云主機無需進行像內地服務器那樣的 ICP 備案&#xff0c;可直接部署使用。…

JAVA同城打車小程序APP打車順風車滴滴車跑腿源碼微信小程序打車源碼

JAVA同城打車系統源碼&#xff1a;多端融合的智能出行生態解決方案一、市場需求與行業背景在共享經濟蓬勃發展和數字化轉型加速的背景下&#xff0c;中國同城出行市場正迎來快速增長期。2025年中國同城出行市場規模預計突破8000億元&#xff0c;年復合增長率超過25%。基于Sprin…

AI入坑: Trae 通過http調用.net 開發的 mcp server

1. 為什么要寫這個 為什么要寫這個內容&#xff0c;前幾天開始加入到ai大軍&#xff0c;通過一周的學習&#xff0c;看了國外網站、看了b站教程、看了抖音教程&#xff0c;居然發現都是開發在本地的mcp server。本地mcp沒問題&#xff0c;個人使用都ok&#xff0c;或者通過npx下…

記錄Pycharm所使用虛擬環境與終端無法對應

在anaconda安裝時&#xff0c;本文中的安裝位置在D盤&#xff0c; D:\soware\anaconda 理論環境位置 D:\soware\anaconda\envs 經檢查PATH配置均未發現錯誤&#xff0c;其次問題并不在于Pycharm的設置中解譯器與終端的設置經過多次查找未發現可用解決方案 在anaconda建立虛擬環…

國產數據庫之YashanDB:新花怒放

YashanDB&#xff08;崖山數據庫&#xff09;是由深圳計算科學研究院自主研發的一款新型關系數據庫管理系統。 YashanDB 在經典數據庫理論基礎上&#xff0c;融入了原創的有界計算、近似計算、并行可擴展和跨模融合計算理論&#xff0c;可以滿足金融、政企、能源等關鍵行業對高…

Java基礎 9.5

1.異常處理基本介紹異常處理就是當異常發生的時候 對異常處理的方式異常處理方式try-catch-finally程序員在代碼中捕獲發生的異常 自行處理throws將發生的異常拋出 交給調用者&#xff08;方法&#xff09;處理 最頂級的處理者是JVM示意圖2.try-catch方式處理異常說明Java提供t…

B.50.10.06-NoSQL數據庫與電商應用

NoSQL數據庫核心原理與電商應用實戰核心思想: NoSQL (Not Only SQL) 數據庫是為了解決傳統關系型數據庫在超大規模數據、高并發和靈活數據模型方面的不足而設計的。它們通過犧牲部分一致性&#xff08;通常是最終一致性&#xff09;和事務的嚴格性&#xff0c;來換取極高的性能…

把開發環境丟云上,我的電腦風扇再也沒轉過!

Hello&#xff0c;兄弟們&#xff0c;我來啦作為一個天天搬磚的程序員&#xff0c;每天最讓我心態爆炸的是啥&#xff1f;不是產品又改需求&#xff0c;也不是 Bug 藏得深&#xff0c;而是TMD——配&#xff01;環&#xff01;境&#xff01;新項目 git clone 下來&#xff0c;…

驅動ft232h通信

FT232H是一個單通道USB 2.0高速&#xff08;480Mb/s&#xff09;轉換為UART/FIFO IC&#xff0c;具有多種工業標準串行或并行接口配置能力。 1.實驗板卡 FPGA型號&#xff1a; FT232H型號&#xff1a; FT232H SINGLE CHANNEL HI-SPEED USB TO MULTIPURPOSE UART/FIFO IC Da…

隔空盜刷、AI釣魚、代理劫持…金融黑產竟進化至此?

【導讀】中國工商銀行發布的《2024網絡金融黑產研究報告》&#xff0c;以深度洞察拆解黑產攻擊“新變種”、勾勒防護新路徑&#xff0c;自發布以來&#xff0c;成為金融安全行業的重要參考坐標。本文會提煉出報告中黑產攻擊的五大技術演變與體系化防護思路&#xff0c;再結合金…

服務器為啥離不開傳感器?一文看懂數據中心“隱形守護者”的關鍵角色

在現代數據中心或企業機房中&#xff0c;服務器不僅僅是“跑程序”的機器&#xff0c;它們還是一整套復雜系統的一部分。為了保證這些服務器穩定、高效、安全地運行&#xff0c;傳感器成了不可或缺的角色。那么&#xff0c;服務器為啥要有傳感器&#xff1f;這些傳感器到底是干…

React JSX 語法講解

&#x1f680; React JSX 語法講解 1. 課程概述 本課程旨在系統講解 JSX&#xff08;JavaScript XML&#xff09; 的核心概念與實戰應用。JSX 是 React 的核心語法擴展&#xff0c;它允許我們在 JavaScript 中編寫類似 HTML 的結構&#xff0c;使得構建用戶界面變得直觀和高效。…

軟件安裝教程(四):在 Windows 上安裝與配置 MATLAB(超詳細)

文章目錄前言1. 安裝前準備&#xff08;必看&#xff09;2. 下載 MATLAB&#xff08;推薦在線安裝&#xff09;3. 在 Windows 上安裝&#xff08;詳細步驟&#xff09;4. 激活 MATLAB&#xff08;在線與離線&#xff09;5. 首次啟動與界面入門6. 推薦的基本配置&#xff08;讓環…

【運維自動化-標準運維】如何創建流程嵌套(子流程)

什么是子流程節點 標準運維里的流程節點有兩類&#xff1a;標準插件節點和子流程節點。子流程節點實際上也是一個流程&#xff0c;比如某個業務線做全網更新時需要更新多個模塊&#xff0c;那每個模塊的更新流程可以稱之為一個子流程。在總流程里直接添加子流程&#xff0c;就通…

clickhouse遷移工具clickhouse-copier

原來的集群沒有高可用而且配置很低&#xff0c;所有準備將一個3分片1副本集群遷到1分片2副本的高配置集群&#xff0c;數據量比較大。 雖然官方已經標記clickhouse-copier已經過時&#xff0c;但為了方便和高效還是用了copier&#xff0c;效果還挺好 以下是使用步驟&#xff1a…

高頻超聲波傳感器:以精準感知重塑未來科技生態

在智能制造的浪潮中&#xff0c;高頻超聲波傳感器正以“隱形工程師”的角色&#xff0c;重新定義著工業檢測、醫療診斷與環境監測的邊界。這款融合了壓電材料科學與微納電子技術的精密儀器&#xff0c;憑借其亞毫米級測量精度與納秒級響應速度&#xff0c;正在成為高端裝備制造…

殘差連接與歸一化結合應用

殘差連接&#xff08;Residual Connection / Skip Connection&#xff09;和歸一化&#xff08;Normalization&#xff09;的結合&#xff0c;是現代深度學習模型&#xff08;尤其是深度神經網絡和Transformer架構&#xff09;成功的關鍵因素之一。 核心概念回顧殘差連接 (Resi…

K8s集群+Rancher Server:部署DolphinScheduler 3.2.2集群

本文手把手演示了如何在 K8s Rancher 環境中快速拉起一套生產可用的 Apache DolphinScheduler 3.2.2 集群。全文圍繞“鏡像加速、依賴本地化、存儲持久化”三大痛點展開&#xff0c;附有詳細的代碼解析&#xff0c;收藏細看吧&#xff01; 環境準備 1、軟件準備2、環境規劃部署…

查詢語言的進化:SQL之后,為什么是GQL?數據世界正在改變

數據是現代世界的核心驅動力。 在數據驅動的世界里&#xff0c;查詢語言就像人與數據溝通的橋梁。 如何高效地獲取、操作和理解數據&#xff0c;取決于查詢語言的演進。 自20世紀70年代關系型數據庫興起以來&#xff0c;SQL&#xff08;Structured Query Language&#xff0…

AgentThink:一種在自動駕駛視覺語言模型中用于工具增強鏈式思維推理的統一框架

文章目錄摘要1. 引言2. 相關工作2.1 自動駕駛中的語言模型2.2 自動駕駛中的視覺問答3. 方法3.1 數據生成流水線3.2 兩階段訓練流程3.2.1 基于 SFT 的推理預熱3.2.2 基于 RLFT 的推理增強3.3 推理與評估4. 實驗4.1 主要實驗結果4.2 工具使用分析4.3 消融實驗4.4 泛化性評估5. 結…