koa2使用阿里云oss的nodejs sdk实现上传图片
nodejs实现上传图片到阿里云,自然是写成接口形式比较方便,前端监听input file的改变,把file对象传入到formData中传入后端,不能直接传入file对象,后端需要接受formData
其他中间件推荐:
上传单张:
最终找到了github上一个朋友用formidable写的,非常好用,代码戳这里
我根据该文件实现了上传图片的代码如下:
nodejs文件:
exports.uploadFile = async (ctx,next) => {
let alioss_uploadfile = function() {
return new Promise(function(resolve, reject) {
//上传单文件,使用formidable
let form = new formidable.IncomingForm()
form.parse(ctx.req, function(err, fields, files) {
if (err) { ctx.throw('500',err)}
// 文件名
let date = new Date()
let time = '' + date.getFullYear() + (date.getMonth() + 1) + date.getDate()
let filepath = 'project/'+time + '/' + date.getTime()
let fileext = files.file.name.split('.').pop()
let upfile = files.file.path
let newfile = filepath + '.' + fileext
//ali-oss
co(function*() {
client.useBucket('p-adm-test')
let result = yield client.put(newfile, upfile)
console.log('文件上传成功!', result.url)
let data=[]
data.push(result.url)
ctx.response.type = 'json'
ctx.response.body = {
errno: 0,
data: data
}
resolve(next())
}).catch(function(err) {
console.log(err)
})
})
})
}
await alioss_uploadfile()
}
但是发现这个中间件只支持上传单文件,如果上传多文件,需要multiparty中间件
上传多张:
参考链接:https://www.cnblogs.com/wuwanyu/p/wuwanyu20160406.html
我实现的代码:
exports.uploadFile = async (ctx,next) => {
let alioss_uploadfile = function() {
return new Promise(function(resolve, reject) {
//上传多文件,使用multiparty
let form = new multiparty.Form({
encoding: 'utf-8',
keepExtensions: true //保留后缀
})
form.parse(ctx.req, async function (err, fields, files) {
let data=[]
for(let f of files.file){
// 文件名
let date = new Date()
let time = '' + date.getFullYear() + (date.getMonth() + 1) + date.getDate()
let filepath = 'project/'+time + '/' + date.getTime()
let fileext = f.originalFilename.split('.').pop()
let upfile = f.path
let newfile = filepath + '.' + fileext
await client.put(newfile, upfile).then((results) => {
console.log('文件上传成功!', results.url)
data.push(results.url)
}).catch((err) => {
console.log(err)
})
}
ctx.response.type = 'json'
ctx.response.body = {
errno: 0,
data: data
}
resolve(next())
})
})
}
await alioss_uploadfile()
}
这里有个for循环,多次执行的阿里云sdk,把返回的链接push到data数组里,最后返回,如果像上边一样用co实现,则最终
ctx.response.body
返回的data只有第一张图片的url,之后的并不能返回,应该是异步问题导致,这里自己学的还不精通,不明白其中解决办法和原理,期望有大神可以解惑!!!感激不尽!!
问题描述在这里===》https://segmentfault.com/q/1010000015425832
如果使用了koa2-multiparty中间件,则函数中的参数files获取不到,而是直接通过ctx.req.files获取传过来的file列表
koa2-multiparty: https://www.npmjs.com/package/koa2-multiparty
我的代码地址:https://github.com/beileixinqing/aliyun-oss-upload
koa2使用阿里云oss的nodejs sdk实现上传图片的更多相关文章
- 使用visual studio 2015调用阿里云oss .net sdk 2.2的putobject接口抛出outofmemory异常
问题描述: 使用阿里云oss .net sdk 2.2版本,使用putobject接口上传文件时,抛出outofmemory异常. 原因分析: 上传时,用于准备上传的数据缓冲区内存分配失败.与应用软件 ...
- iOS使用阿里云OSS对象存储 (SDK 2.1.1)
最近项目中用到了阿里云OSS对象存储,用来存储APP中图片.音频等一些数据.但坑爹的阿里云居然在11月20日将SDK版本更新到了2.1.1,然而网上给出的教程都是1.*版本的(针对iOS),两个版本所 ...
- thinkphp使用阿里云OSS最新SDK,文件部署
这文章是建立在你已经注册号阿里云的OSS,和创建好Bucket前提下: 其实阿里云的帮助与文档写的很详细,这里只说一下源码方式 1.phpsdk下载地址(摘自阿里云OSS的帮助与文档)(也有我自己下载 ...
- 快速上手阿里云oss SDK
使用阿里云oss SDK 依赖安装: pip install oss2 pip install aliyun-python-sdk-sts 版本最好是 2.7.5 或以上 如果要开启 crc64 循环 ...
- 前端(react)上传到阿里云OSS存储 实例
需求背景 由于现有的后台管理系统,上传的视频越来越大,加上上传视频较慢,后端小哥提出直接从前端上传视频或者其他文件到阿里云OSS存储. 阿里云OSS 阿里云OSS文档介绍,这里不做过多赘述 安装 原本 ...
- phpcmsv9 阿里云OSS云存储整合教程
该教程算不上是phpcmsv9阿里云oss插件,所以整个修改及其代码覆盖前请一定记得备份.还有一点就是后台发布文章时上传的附件还是会保存在你的服务器上,基于以下原因:1.个人的需求是前台页面需要使用t ...
- 阿里云oss上传图片
1.首先我们要下载阿里云oss的sdk包:(可以下载原版的,改过的通用版在本人的百度云,嘎嘎嘎~) 2.下载好之后放到项目文件目录里面 3.要在需要的控制器引用这个sdk文件例如: include(& ...
- (转)云存储:阿里云OSS 、又拍云和 七牛 的比较
阿里OSS:好处就是,那是一套完整的体系,存储,数据库,CDN,服务器,阿里都可以给你全包.缺点,费用对于没有盈利的网站来说太高了,好像定位就是给那些高端客户使用的,而且CDN,OSS的流量是分开收费 ...
- laravel下使用阿里云oss上传图片
对小公司而言,使用阿里云oss比直接买硬盘要划算的多,不管从存储性价比上还是从网速负载上.最近因为公司的项目有比较大的图片存储访问需求,所以决定使用阿里云的oss. 在研究了一下以后,摆着不自己造轮子 ...
随机推荐
- 简析TCP的三次握手与四次分手<转>
TCP是什么? 具体的关于TCP是什么,我不打算详细的说了:当你看到这篇文章时,我想你也知道TCP的概念了,想要更深入的了解TCP的工作,我们就继续.它只是一个超级麻烦的协议,而它又是互联网的基础,也 ...
- Jquery调用ajax参数说明
代码中有详细注释,直接上代码. 注释掉的选项,一般用不到,直接用最基本的部分就可以了. $.ajax({ // 请求的URL url: '../Daily/Daily_Report', //HTTP ...
- fiddler手机端抓包
1. 买个360随身wifi,插在台式机上生成热点,手机连上自己的wifi 如果电脑与手机本就在一个局域网,省略这一步 2. 在fiddler中如下设置: 3. 查看电脑无线连接属性 4. 在手机上设 ...
- SpringBoot2 【关于:Table 'XXX.hibernate_sequence' doesn't exist】
将ID生成略组改成@GeneratedValue(strategy = GenerationType.IDENTITY).
- JQ 获取窗体的高度
alert($(window).height()); //浏览器时下窗口可视区域高度 alert($(document).height()); //浏览器时下窗口文档的高度 alert($(docum ...
- Sword pcre库使用
#include <stdlib.h> #include <string.h> #include "regularhelper.h" #include &q ...
- 常用网络名词mark & 网络学习笔记
自 治 系 统 ( A S, A utonomous System ) IGP 内部网关协议 I n t e r i o r G a t e w a y P r o t o c o l 域 内 选 路 ...
- 《FPGA全程进阶---实战演练》第九章 计数器要注意
本小节我们来做一个好玩的事情,就是计数器,还记得在做LED自加实验时我们就曾经提到过关于计数器的相关议题,那么这节我们就来讨论讨论. 探讨一下如下的问题:请用verilog记八个数的写法,分析这个可以 ...
- HashMap的最大容量为什么是2的30次方?
今天看HashMap的底层实现,发现HashMap的最大容量规定为: // 最大容量(必须是2的幂且小于2的30次方,传入容量过大将被这个值替换) static final int MAXIMUM_C ...
- (笔记)Linux中的终端、控制台、tty、pty
1>tty(终端设备的统称): tty一词源于teletypes,或者teletypewriters,原来指的是电传打字机,是通过串行线用打印机键盘阅读和发送信息的东西,后来这东西被键盘与显示器 ...