node实现文件上传到七牛云
使用七牛云提供的Node.js SDK(https://developer.qiniu.com/kodo/1289/nodejs)实现文件上传
服务端:
1、安装JDK
1 | npm/cnpm install qiniu |
or
1 | yarn add qiniu |
2、导出七牛云配置文件的Token
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | // 七牛云配置文件 const qiniu = require( 'qiniu' ); // 创建上传凭证(accessKey 和 secretKey在七牛云个人中心中有,blog 是七牛云创建的空间名称) const accessKey = 'xxxxxxx' ; // ak密钥 const secretKey = 'xxxx' ; // sk密钥 const mac = new qiniu.auth.digest.Mac(accessKey, secretKey); const options = { scope: 'blog' // 存储空间的名字 }; const putPolicy = new qiniu.rs.PutPolicy(options); const uploadToken = putPolicy.uploadToken(mac); module.exports = { uploadToken // 导出的是七牛云生成的token }; |
3、暴露接口给前端使用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | // 前端获取到七牛云返回的token const express = require( 'express' ); // 定义路由级中间件 const router = express.Router(); const uploadToken = require( './qiniu' ) router.get( '/getQiniuToken' , (req, res) => { res.json({ code: 200, data: uploadToken.uploadToken, messages: '获取成功' }); }); module.exports = router; |
4、服务层抛出接口
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | //1.引入express模块 const express = require( 'express' ); const mongoose = require( 'mongoose' ); const bodyParse = require( 'body-parser' ); const mongoObj = { hostName: 'xxx' , // 数据库地址 dataBaseName: 'xxx' , // 数据库名称 username: 'xxx' , // 用户名称 password: 'xxx' // 用户密码 }; mongoose .connect(`mongodb: //${mongoObj.username}:${mongoObj.password}@${mongoObj.hostName}/${mongoObj.dataBaseName}`, { useNewUrlParser: true , useUnifiedTopology: true }) .then(() => console.log( '数据库连接成功!' )) . catch ((err) => console.log( 'err' , err)); mongoose.set( 'strictQuery' , true ); //创建app对象 const app = express(); app.use(bodyParse.json()); app.use(bodyParse.urlencoded({ extended: true })); // 定义服务启动接口 app.listen(8098, () => { console.log( 'app 8098' ); }); // 引入定义的路由并应用 const qiniuToken = require( './routes/qiniuToken' ); app.use( '/api' , qiniuToken); |
注(踩坑记):我这里的MongoDB的数据库,会存在一个时不时就被一些无聊的人黑的问题,所以我加了用户名和密码认证,换了端口号,做了每天备份的操作,所以使用数据库的时候一定要注意这个问题。
前端调用:
1、/api/upload.js
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | import request from '@/utils/request' ; // 获取七牛云token export function getQiniuToken(params) { return request({ url: '/getQiniuToken' , method: 'get' , params }); } // 上传文件 export function uploadFile(data) { return request({ url: import .meta.env.VITE_APP_FILE_UPLOAD_API, // 七牛云上传地址 目前我用的华南地区为(https://upload-z2.qiniup.com) method: 'post' , headers: { 'Content-Type' : 'multipart/form-data' }, data }); } |
2、页面调用封装接口
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 | <template> <div class = "upload-box" > <el-upload class = "upload-demo" drag :action= "upload.action" :http-request= "httpRequestFun" :auto-upload= "true" :before-upload= "beforeUpload" > <el-icon class = "el-icon--upload" ><upload-filled /></el-icon> <div class = "el-upload__text" >Drop file here or <em>click to upload</em></div> <template #tip> <div class = "el-upload__tip" >jpg/png files with a size less than 500kb</div> </template> </el-upload> </div> </template> <script setup> import { ref } from 'vue' ; import moment from 'moment' ; import { getQiniuToken, uploadFile } from '@/api/upload' ; import { UploadFilled } from '@element-plus/icons-vue' ; const upload = ref({ action: import .meta.env.VITE_APP_FILE_UPLOAD_API, // 华南地区 httpRequest: import .meta.env.VITE_APP_FILE_PREVIEW_API // 自定义域名 }); const httpRequestFun = async (req) => { const { data } = await getQiniuToken(); const formData = new FormData(); const fileName = `daily-photos/${moment( new Date()).format( 'YYYYMMDD' )}/${req.file.name}`; // /代表目录 formData.append( 'file' , req.file); formData.append( 'token' , data); // 获取到的七牛云token formData.append( 'key' , fileName); // 文件名称 const res = await uploadFile(formData); console.log(res); console.log(upload.value.httpRequest + '/' + res.data.key); // 预览地址 }; </script> <style lang= "scss" scoped> .upload-box { width: 200px; height: 150px; margin: 0 auto; } </style> |
上传成功,查看七牛云存储空间文件:
希望大佬看到有不对的地方,提出博主予以改正!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· .NET10 - 预览版1新功能体验(一)