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.mzph.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 …