nodejs实现上传图片到阿里云,自然是写成接口形式比较方便,前端监听input file的改变,把file对象传入到formData中传入后端,不能直接传入file对象,后端需要接受formData

其他中间件推荐:

formidable

connect-multiparty

multiparty

koa2-multiparty

上传单张:

最终找到了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实现上传图片的更多相关文章

  1. 使用visual studio 2015调用阿里云oss .net sdk 2.2的putobject接口抛出outofmemory异常

    问题描述: 使用阿里云oss .net sdk 2.2版本,使用putobject接口上传文件时,抛出outofmemory异常. 原因分析: 上传时,用于准备上传的数据缓冲区内存分配失败.与应用软件 ...

  2. iOS使用阿里云OSS对象存储 (SDK 2.1.1)

    最近项目中用到了阿里云OSS对象存储,用来存储APP中图片.音频等一些数据.但坑爹的阿里云居然在11月20日将SDK版本更新到了2.1.1,然而网上给出的教程都是1.*版本的(针对iOS),两个版本所 ...

  3. thinkphp使用阿里云OSS最新SDK,文件部署

    这文章是建立在你已经注册号阿里云的OSS,和创建好Bucket前提下: 其实阿里云的帮助与文档写的很详细,这里只说一下源码方式 1.phpsdk下载地址(摘自阿里云OSS的帮助与文档)(也有我自己下载 ...

  4. 快速上手阿里云oss SDK

    使用阿里云oss SDK 依赖安装: pip install oss2 pip install aliyun-python-sdk-sts 版本最好是 2.7.5 或以上 如果要开启 crc64 循环 ...

  5. 前端(react)上传到阿里云OSS存储 实例

    需求背景 由于现有的后台管理系统,上传的视频越来越大,加上上传视频较慢,后端小哥提出直接从前端上传视频或者其他文件到阿里云OSS存储. 阿里云OSS 阿里云OSS文档介绍,这里不做过多赘述 安装 原本 ...

  6. phpcmsv9 阿里云OSS云存储整合教程

    该教程算不上是phpcmsv9阿里云oss插件,所以整个修改及其代码覆盖前请一定记得备份.还有一点就是后台发布文章时上传的附件还是会保存在你的服务器上,基于以下原因:1.个人的需求是前台页面需要使用t ...

  7. 阿里云oss上传图片

    1.首先我们要下载阿里云oss的sdk包:(可以下载原版的,改过的通用版在本人的百度云,嘎嘎嘎~) 2.下载好之后放到项目文件目录里面 3.要在需要的控制器引用这个sdk文件例如: include(& ...

  8. (转)云存储:阿里云OSS 、又拍云和 七牛 的比较

    阿里OSS:好处就是,那是一套完整的体系,存储,数据库,CDN,服务器,阿里都可以给你全包.缺点,费用对于没有盈利的网站来说太高了,好像定位就是给那些高端客户使用的,而且CDN,OSS的流量是分开收费 ...

  9. laravel下使用阿里云oss上传图片

    对小公司而言,使用阿里云oss比直接买硬盘要划算的多,不管从存储性价比上还是从网速负载上.最近因为公司的项目有比较大的图片存储访问需求,所以决定使用阿里云的oss. 在研究了一下以后,摆着不自己造轮子 ...

随机推荐

  1. ios9 之后使用CFNumberGetValue出错

    将编译源类型设置为根据文件而定:

  2. java将图片转换成二进制

    package com.oumyye.图片; import java.awt.image.BufferedImage; import java.io.ByteArrayInputStream; imp ...

  3. Android Toolbar的使用 顶部标题栏+后退键

    最近设计安卓里面有个标题栏,里面有个后退键,可以完成后退之类的功能. 好,刚好可以用Toolbar去实现 上代码:activity_main.xml <?xml version="1. ...

  4. C# DIctionary:集合已修改,可能无法执行枚举操作

    C#中直接对集合Dictionary进行遍历并修改其中的值,会报错,如下代码就会报错:集合已修改;可能无法执行枚举操作.代码如下 public void ForeachDic() { Dictiona ...

  5. fast neural style transfer图像风格迁移基于tensorflow实现

    引自:深度学习实践:使用Tensorflow实现快速风格迁移 一.风格迁移简介 风格迁移(Style Transfer)是深度学习众多应用中非常有趣的一种,如图,我们可以使用这种方法把一张图片的风格“ ...

  6. Spark 介绍(基于内存计算的大数据并行计算框架)

    Spark 介绍(基于内存计算的大数据并行计算框架)  Hadoop与Spark 行业广泛使用Hadoop来分析他们的数据集.原因是Hadoop框架基于一个简单的编程模型(MapReduce),它支持 ...

  7. Maven打包生成源码包和Javadoc包

    https://blog.csdn.net/top_code/article/details/53586551 当我们开发了一个公共模块,将它deploy到Maven仓库时,最好同时提供源码包和Jav ...

  8. R语言常用基础知识(入门)

    data.frame 动态确定列名称 var <- "mpg" #Doesn't work mtcars$var #These both work, but note tha ...

  9. [技术选型] CDH-Cloudera Distribution Hadoop

    hadoop是一个开源项目,所以很多公司在这个基础进行商业化,Cloudera对hadoop做了相应的改变. Cloudera公司的发行版,我们将该版本称为CDH(Cloudera Distribut ...

  10. [spark 快速大数据分析读书笔记] 第一章 导论

    [序言] Spark 基于内存的基本类型 (primitive)为一些应用程序带来了 100 倍的性能提升.Spark 允许用户程序将数据加载到 集群内存中用于反复查询,非常适用于大数据和机器学习. ...