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. 在研究了一下以后,摆着不自己造轮子 ...
随机推荐
- 基于jQuery个性圆圈倒计时特效
基于jQuery个性圆圈倒计时特效里面包含十几款不用效果的jQuery倒计时特效下载.效果图如下: 在线预览 源码下载 实现的代码. html代码: <section class=" ...
- 使用 WebSphere ILOG JRules 开发保险应用系统
使用 WebSphere ILOG JRules 开发保险应用系统 概述 保险行业在国内是一个充分竞争的行业,竞争的加剧导致保险公司的业务管理等各项费用在增长.而保险公司业务支撑系统的先进性与灵活支撑 ...
- C语言 · 十进制数转八进制数
算法训练 十进制数转八进制数 时间限制:1.0s 内存限制:512.0MB 编写函数把一个十进制数输出其对应的八进制数. 样例输入 9274 样例输出 22072 #includ ...
- Aspose.Cells Smart markers 基于模板导出Excel
Aspose.Cells可以预先定义Excel模板,然后填充数据(官方文档:http://www.aspose.com/docs/display/cellsjava/Smart+Markers). 设 ...
- android开发(30) 使用WebView,点击网页中的链接建立QQ 临时会话 WPA
在PC端,我们可以通过一个URL链接,点击后启动QQ,这是很好的用户跳转体验.很方便. 使用的链接如下: <a target="_blank" href="http ...
- dapper支持操作函数和事物
dapper除了支持基础的CURD.存储过程以外,还支持操作函数和事物. dapper操作函数的代码如下: using Dapper; using System; using System.Colle ...
- Eureka 高可用
spring: profiles: eureka1 server: port: 8001 eureka: instance: hostname: eureka1 client: serviceUrl: ...
- 深入浅出学习Hibernate框架(二):JDBC基础操作
上篇博客<深入浅出学习Hibernate框架(一):从实例入手初识Hibernate框架>简单介绍了一下Hibernate框架,并且举了一个实例来了解Hibernate.这篇博客将介绍JD ...
- C#里的SubString和Convert.ToDateTime
1.C#里的SubString String.SubString(int index,int length) index:开始位置,从0开始 length:你要取的子字符串的长度 2.C#语言 ...
- 使用VMware将Linux装在物理硬盘上,开机即可进入Linux
我的笔记本上是双系统Windows和Linux .经常需要在两个系统间切换,很麻烦.于是我想到如果能用VMWare虚拟机加载物理硬盘中的系统,可以在需要时,直接启动另外一个系统. 注意:我的双 ...