node.js 實戰——express圖片保存到本地或服務器(七牛云、騰訊云、阿里云)

本地

? 使用formidable 讀取表單內容

npm i formidable 

? 使用mime-types 獲取圖片后綴

npm install mime-types

? js 中提交form表單

 document.getElementById('uploadForm').addEventListener('submit', function(e){e.preventDefault();const blob =preview._blob;if(!blob){alert("請先選擇并裁剪頭像");return;}const formData = new FormData();formData.append('file', blob);//未裁剪使用代碼// const file =input.files[0];// if(!file) return alert('Please upload a valid image!');//// let formData = new FormData();// formData.append('file', file);let xhr = new XMLHttpRequest();xhr.open('POST', '/users/upload-avatar');xhr.upload.addEventListener('progress', (e) => {if(e.lengthComputable){let percent = Math.round((e.loaded / e.total) * 100);progressWrapper.classList.remove('d-none');progressBar.style.width= percent + '%';progressBar.innerText = percent + '%';}})xhr.onload =function () {if(xhr.status === 200) {alert("successfully uploaded!");}else{alert("fail to upload");}}xhr.send(formData);})

? express 中routers的js

var express = require('express');
var router = express.Router();
const { IncomingForm } = require('formidable'); // ? 注意不是直接 require('formidable')
const path = require('path');
const mime = require('mime-types')/* GET users listing. */
router.get('/', function(req, res, next) {res.render('user', { title: '訂餐系統' });
});router.post('/upload-avatar', function(req, res, next) {//創建表單對象const form =new IncomingForm({multiple:true,//設置上傳文件的保存目錄uploadDir:__dirname+'/../public/uploads/',//保存文件后綴keepExtension:true,// 支持多文件multiples:true,filename:(name,ext,part,form)=>{const timestamp = Date.now();let extension = mime.extension(part.mimetype) || '';return `${timestamp}-${Math.random().toString(36).slice(2)}${extension ? '.' + extension : ''}`;}});//form.parse(req,function(err,fields,files){if(err){next(err);return;}res.json({files,files});})})module.exports = router;

在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述

七牛云

? 實現步驟概覽

  1. 使用 formidable 獲取上傳的圖片流或臨時文件路徑
  2. 使用 qiniu SDK 上傳到七牛云對象存儲
  3. 返回文件 URL 給前端

? 安裝依賴

npm install formidable qiniu

?

? 七牛云配置準備

你需要準備這些信息:
? accessKey
? secretKey
? bucket(空間名稱)
? domain(空間綁定的 CDN 域名)

? 完整 Express + formidable + 七牛 上傳示例

const express = require('express');
const { IncomingForm } = require('formidable');
const fs = require('fs');
const path = require('path');
const qiniu = require('qiniu');const app = express();// 七牛配置
const accessKey = '你的AccessKey';
const secretKey = '你的SecretKey';
const bucket = '你的Bucket';
const domain = 'http://你的空間域名'; // 綁定的 CDN 域名(帶 http)// 上傳憑證
const mac = new qiniu.auth.digest.Mac(accessKey, secretKey);
const putPolicy = new qiniu.rs.PutPolicy({ scope: bucket });
const uploadToken = putPolicy.uploadToken(mac);// 七牛配置對象
const config = new qiniu.conf.Config();
// 根據你空間的 Zone 設置,如華東為 Zone_z0
config.zone = qiniu.zone.Zone_z0;// 表單上傳接口
app.post('/upload', (req, res) => {const form = new IncomingForm({ multiples: false, keepExtensions: true });form.parse(req, (err, fields, files) => {if (err) return res.status(500).json({ error: '上傳失敗' });const file = files.images || files.file;const localFilePath = file.filepath || file.path; // 不同版本字段不同const fileExt = path.extname(file.originalFilename || file.name || '');const fileName = `${Date.now()}-${Math.random().toString(36).slice(2)}${fileExt}`;const putExtra = new qiniu.form_up.PutExtra();const formUploader = new qiniu.form_up.FormUploader(config);formUploader.putFile(uploadToken, fileName, localFilePath, putExtra, (respErr, respBody, respInfo) => {// 刪除本地臨時文件(可選)fs.unlink(localFilePath, () => {});if (respErr) return res.status(500).json({ error: '七牛上傳失敗' });if (respInfo.statusCode === 200) {res.json({success: true,url: `${domain}/${respBody.key}` // 返回七牛圖片地址});} else {res.status(respInfo.statusCode).json({ error: respBody });}});});
});app.listen(3000, () => {console.log('Server running on http://localhost:3000');
});

? 七牛空間設置建議

設置項建議
空間類型公有(或使用私有 + 臨時下載鏈接)
綁定 CDN 域名用于外鏈圖片地址
設置防盜鏈生產環境建議設置 Referer 防盜鏈

? 最終效果

上傳成功后,前端將得到形如:

{
“success”: true,
“url”: “http://cdn.yourdomain.com/1700000000-abc123.jpg”
}

前端就可以將這個 URL 顯示為圖片頭像或多圖預覽。

騰訊云

如果你要把上傳的圖片保存到 騰訊云對象存儲(COS),可以使用官方的 COS Node.js SDK。

? 安裝依賴

npm install formidable cos-nodejs-sdk-v5

? 騰訊云 COS 準備

你需要準備以下內容:

參數來源(騰訊云后臺)
SecretId訪問管理 - API 密鑰管理
SecretKey同上
Bucket例如:example-1250000000
Region如 ap-nanjing

? 后端上傳圖片到騰訊云 COS

const express = require('express');
const { IncomingForm } = require('formidable');
const COS = require('cos-nodejs-sdk-v5');
const fs = require('fs');
const path = require('path');const app = express();// 騰訊云配置
const cos = new COS({SecretId: '你的SecretId',SecretKey: '你的SecretKey',
});// 上傳接口
app.post('/upload', (req, res) => {const form = new IncomingForm({ keepExtensions: true });form.parse(req, (err, fields, files) => {if (err) return res.status(500).json({ error: '上傳失敗' });const file = files.file || files.image || files.images;const filePath = file.filepath || file.path;const fileExt = path.extname(file.originalFilename || file.name || '');const fileName = `uploads/${Date.now()}-${Math.random().toString(36).slice(2)}${fileExt}`;// 上傳到 COScos.putObject({Bucket: '你的Bucket-數字ID',Region: 'ap-你的地域',Key: fileName,Body: fs.createReadStream(filePath),ContentLength: fs.statSync(filePath).size,}, (err, data) => {// 刪除臨時文件fs.unlink(filePath, () => {});if (err) return res.status(500).json({ error: 'COS上傳失敗', detail: err });const url = `https://${data.Location}`;res.json({ success: true, url });});});
});app.listen(3000, () => {console.log('Server started on http://localhost:3000');
});

? 示例返回

{"success": true,"url": "https://example-1250000000.cos.ap-nanjing.myqcloud.com/uploads/1700000000-abc123.jpg"
}

🛡? 注意事項

  • Bucket 名稱必須是:- 格式,例如:mybucket-1250000000
  • 記得綁定好 CNAME 或設置跨域(CORS)策略以支持前端訪問
  • 騰訊云對象存儲會自動生成公網訪問鏈接(基于默認域名)

阿里云

如果你想將上傳的圖片保存到 阿里云 OSS(對象存儲服務),可以使用官方的 ali-oss Node.js SDK。

? 安裝依賴

npm install formidable ali-oss

? 準備阿里云 OSS 配置

你需要這些信息:

項目獲取方式
accessKeyId阿里云賬號控制臺 → RAM 用戶 → 訪問密鑰管理
accessKeySecret同上
bucketOSS 控制臺創建的 Bucket 名稱
regionBucket 所在地域,如 oss-cn-hangzhou
cdnDomain推薦綁定自定義 CDN 域名,如 https://img.example.com

? 后端 Express 示例

const express = require('express');
const { IncomingForm } = require('formidable');
const OSS = require('ali-oss');
const fs = require('fs');
const path = require('path');const app = express();// 阿里云 OSS 配置
const client = new OSS({region: 'oss-cn-hangzhou',          // 修改為你的地域accessKeyId: '你的AccessKeyId',accessKeySecret: '你的AccessKeySecret',bucket: '你的Bucket名稱',
});const cdnDomain = 'https://your-cdn.example.com'; // 可選:綁定的自定義域名app.post('/upload', (req, res) => {const form = new IncomingForm({ keepExtensions: true });form.parse(req, async (err, fields, files) => {if (err) return res.status(500).json({ error: '上傳失敗' });const file = files.file || files.image || files.images;const filePath = file.filepath || file.path;const ext = path.extname(file.originalFilename || file.name || '');const fileName = `uploads/${Date.now()}-${Math.random().toString(36).slice(2)}${ext}`;try {const result = await client.put(fileName, filePath);fs.unlink(filePath, () => {}); // 刪除臨時文件res.json({success: true,url: cdnDomain ? `${cdnDomain}/${fileName}` : result.url,});} catch (ossErr) {res.status(500).json({ error: 'OSS上傳失敗', detail: ossErr });}});
});app.listen(3000, () => {console.log('Server running at http://localhost:3000');
});

? 示例上傳成功響應

{"success": true,"url": "https://your-cdn.example.com/uploads/1700000000-abc123.jpg"
}

📝 注意事項

  • 推薦在 OSS 控制臺開啟跨域(CORS) 支持,方便前端訪問
  • 上傳后圖片即刻可通過公網域名訪問
  • 如果你使用的是綁定 CDN 的域名,請確保緩存配置正確(或開啟自動刷新)

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

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

相關文章

2025最新:3分鐘使用Docker快速部署單節點Redis

🧑?🏫 詳細教程:通過 Docker 安裝單節點 Redis 🛠? 前提條件: 你需要在 Ubuntu 系統上進行操作(如果你在其他系統上操作,可以按相似步驟進行調整)。已安裝 Docker 和 Docker Com…

CentOS 7 系統下安裝 OpenSSL 1.0.2k 依賴問題的處理

前面有提到過這個openssl的版本沖突問題,也是在這次恢復服務器時遇到的問題,我整理如下,供大家參考。小小一個軟件的安裝,挺坑的。 一、問題 項目運行環境需要,指定PHP7.0.9這個版本,但是?系統版本與軟件…

LoRA(Low-Rank Adaptation)原理詳解

LoRA(Low-Rank Adaptation)原理詳解 LoRA(低秩適應)是一種參數高效微調(Parameter-Efficient Fine-Tuning, PEFT)技術,旨在以極低的參數量實現大模型在特定任務上的高效適配。其核心思想基于低秩分解假設,即模型在適應新任務時,參數更新矩陣具有低秩特性,可用少量參…

Solana批量轉賬教程:提高代幣持有地址和生態用戶空投代幣

前言 Solana區塊鏈因其高吞吐量和低交易費用成為批量操作(如空投)的理想選擇。本教程將介紹幾種在Solana上進行批量轉賬的方法,幫助您高效地向多個地址空投代幣。 solana 賬戶模型 在Solana中有三類賬戶: 數據賬戶,…

基于LSTM與SHAP可解釋性分析的神經網絡回歸預測模型【MATLAB】

基于LSTM與SHAP可解釋性分析的神經網絡回歸預測模型【MATLAB】 一、引言 在數據驅動的智能時代,時間序列預測已成為許多領域(如金融、氣象、工業監測等)中的關鍵任務。長短期記憶網絡(LSTM)因其在捕捉時間序列長期依…

手機網頁提示ip被拉黑名單什么意思?怎么辦

?當您使用手機瀏覽網頁時,突然看到“您的IP地址已被列入黑名單”的提示,是否感到困惑和不安?這種情況在現代網絡生活中并不罕見,但確實會給用戶帶來諸多不便。本文將詳細解釋IP被拉黑的含義、常見原因,并提供一系列實…

Java消息隊列性能優化實踐:從理論到實戰

Java消息隊列性能優化實踐:從理論到實戰 1. 引言 在現代分布式系統架構中,消息隊列(Message Queue,MQ)已經成為不可或缺的中間件組件。它不僅能夠實現系統間的解耦,還能提供異步通信、流量削峰等重要功能…

BUUCTF——Cookie is so stable

BUUCTF——Cookie is so stable 進入靶場 頁面有點熟悉 跟之前做過的靶場有點像 先簡單看一看靶場信息 有幾個功能點 flag.php 隨便輸了個admin 根據題目提示 應該與cookie有關 抓包看看 構造payload Cookie: PHPSESSIDef0623af2c1a6d2012d57f3529427d52; user{{7*7}}有…

json格式不合法情況下,如何盡量保證數據可用性

背景 在工作流程中,并非所有數據都如人所愿,即使json版本也會由于csv、tsv、excel、text等不同文件格式轉化、獲取數據源不完整等問題,造成我們要處理的json文件存在不合法。 嘗試方案 除了人為修正外,有效的方法是使用json“修…

Python基礎總結(十)之函數

Python函數 函數是Python中也是非常重要的,函數是帶名字的代碼塊,用于完成具體的工作。要執行函數定義的特定任務,可調用該函數。 一、函數的定義 函數的定義要使用def關鍵字,def后面緊跟函數名,縮進的為函數的代碼塊。 def test():print("Hello,World")上述…

懶人美食幫SpringBoot訂餐系統開發實現

概述 快速構建一個訂餐系統,今天,我們將通過”懶人美食幫”這個基于SpringBoot的訂餐系統項目,為大家詳細解析從用戶登錄到多角色權限管理的完整實現方案。本教程特別適合想要學習企業級應用開發的初學者。 主要內容 1. 用戶系統設計與實現…

AI(學習筆記第三課) 使用langchain進行AI開發(2)

文章目錄 AI(學習筆記第三課) 使用langchain進行AI開發(2)學習內容:1. 返回結構化數據(structured_output pydantic)1.1 使用背景1.2 返回結構化數據示例代碼(pydantic)1.3 執行測試代碼2 返回結構化數據(json)2.1 示例代碼2.2 執行結果3 給提供一些例子(few shot pr…

unity 使用藍牙通訊(PC版,非安卓)

BlueTooth in pc with unity 最近接到的需求是在unity里面開發藍牙功能,其實一開始我并不慌,因為據我所知,unity有豐富的插件可以使用,但是問題隨之而來 1.unity里面無法直接與藍牙通訊(后來找到了開啟runtime一類的東西,但是我找了半天也沒找到在哪里可以打開) 2.引入dll通過d…

MySQL中的意向鎖 + next-key鎖 + 間隙鎖

引言 在數據庫并發控制中,鎖機制是保障數據一致性和隔離性的核心手段。MySQL中意向鎖、間隙鎖以及next-key鎖等復雜鎖類型,旨在協調表級鎖與行級鎖之間的關系,防止數據的臟讀、不可重復讀和幻讀現象,尤其是在可重復讀隔離級別下發…

機器學習 數據集

數據集 1. scikit-learn工具介紹1.1 scikit-learn安裝1.2 Scikit-learn包含的內容 2 數據集2.1 sklearn玩具數據集介紹2.2 sklearn現實世界數據集介紹2.3 sklearn加載玩具數據集示例1:鳶尾花數據示例2:分析糖尿病數據集 2.4 sklearn獲取現實世界數據集示…

Linux-c語言串口程序

c語言串口程序 // C library headers #include <stdio.h> #include <string.h>// Linux headers #include <fcntl.h> // Contains file controls like O_RDWR #include <errno.h> // Error integer and strerror() function #include <termios.h&g…

TCP IP

TCP/IP 通信協議&#xff0c;不是單一協議&#xff0c;是一組協議的集合 TCP IP UDP 1.建立鏈接 三次握手 第一步&#xff1a;客戶端發送一個FIN報文&#xff0c;SEQX,等待服務器回應 第二步&#xff1a;服務器端受到&#xff0c;發送ackx1,seqy, 等待客戶端回應 第三步&am…

用uniapp在微信小程序實現畫板(電子簽名)功能,使用canvas實現功能

效果&#xff1a; 功能&#xff1a;實現重簽 退出 保存 等功能 解決的問題: 電子簽名畫布抖動問題解 注意&#xff1a; 保存的時候上傳到自己的服務器地址&#xff0c;后端返回圖片地址 代碼&#xff1a; <template><view><view class"signature&qu…

機器學習經典算法:用決策樹原理優化新能源汽車續航能力

?? “用決策樹重構新能源車能量大腦!算法推導+代碼實戰全解,續航暴增15%” 決策樹算法就像我們生活中做決策的 “流程指南”,通過層層判斷得出最終結論。比如你去超市買水果,站在琳瑯滿目的貨架前,就不自覺地用上了決策樹思維。首先,你可能會想 “今天想吃酸的還是甜的…

【Unity中的數學】—— 四元數

一、四元數的定義&#x1f60e; 四元數是一種高階復數&#xff0c;是一個四維空間的概念&#xff0c;相對于復數的二維空間。它可以表示為 q s i x j y k z q s ix jy kz qsixjykz&#xff0c;其中 s s s、 x x x、 y y y、 z z z 都是實數&#xff0c;并且滿足 i …