摘要:因?yàn)樯?jí)到新的版本,之前的通過(guò)很多上傳圖片的方式都已經(jīng)不適用了,所以自己就寫(xiě)了一個(gè)對(duì)于上傳圖片的小記錄一下心得。
因?yàn)樯?jí)到新的node版本,之前的通過(guò)很多上傳圖片的方式都已經(jīng)不適用了,所以自己就寫(xiě)了一個(gè)對(duì)于 koa2上傳圖片的小demo,記錄一下心得。
廢話不多說(shuō),下面直接上代碼,里面都有注釋。
const Koa = require("koa"); const route = require("koa-route"); const serve = require("koa-static"); const inspect = require("util").inspect const path = require("path") const os = require("os") const fs = require("fs") const Busboy = require("busboy") const qiniu = require("qiniu") const qiniuConfig = require("./qiniuconfig") const app = new Koa(); app.use(serve(__dirname + "/public/")); // 寫(xiě)入目錄 const mkdirsSync = (dirname) => { if (fs.existsSync(dirname)) { return true } else { if (mkdirsSync(path.dirname(dirname))) { fs.mkdirSync(dirname) return true } } return false } function getSuffix (fileName) { return fileName.split(".").pop() } // 重命名 function Rename (fileName) { return Math.random().toString(16).substr(2) + "." + getSuffix(fileName) } // 刪除文件 function removeTemImage (path) { fs.unlink(path, (err) => { if (err) { throw err } }) } // 上傳到七牛 function upToQiniu (filePath, key) { const accessKey = qiniuConfig.accessKey // 你的七牛的accessKey const secretKey = qiniuConfig.secretKey // 你的七牛的secretKey const mac = new qiniu.auth.digest.Mac(accessKey, secretKey) const options = { scope: qiniuConfig.scope // 你的七牛存儲(chǔ)對(duì)象 } const putPolicy = new qiniu.rs.PutPolicy(options) const uploadToken = putPolicy.uploadToken(mac) const config = new qiniu.conf.Config() // 空間對(duì)應(yīng)的機(jī)房 config.zone = qiniu.zone.Zone_z2 const localFile = filePath const formUploader = new qiniu.form_up.FormUploader(config) const putExtra = new qiniu.form_up.PutExtra() // 文件上傳 return new Promise((resolved, reject) => { formUploader.putFile(uploadToken, key, localFile, putExtra, function (respErr, respBody, respInfo) { if (respErr) { reject(respErr) } if (respInfo.statusCode == 200) { resolved(respBody) } else { resolved(respBody) } }) }) } // 上傳到本地服務(wù)器 function uploadFile (ctx, options) { const _emmiter = new Busboy({headers: ctx.req.headers}) const fileType = options.fileType const filePath = path.join(options.path, fileType) const confirm = mkdirsSync(filePath) if (!confirm) { return } console.log("start uploading...") return new Promise((resolve, reject) => { _emmiter.on("file", function (fieldname, file, filename, encoding, mimetype) { const fileName = Rename(filename) const saveTo = path.join(path.join(filePath, fileName)) file.pipe(fs.createWriteStream(saveTo)) file.on("end", function () { resolve({ imgPath: `/${fileType}/${fileName}`, imgKey: fileName }) }) }) _emmiter.on("finish", function () { console.log("finished...") }) _emmiter.on("error", function (err) { console.log("err...") reject(err) }) ctx.req.pipe(_emmiter) }) } app.use(route.post("/upload", async function(ctx, next) { const serverPath = path.join(__dirname, "./uploads/") // 獲取上存圖片 const result = await uploadFile(ctx, { fileType: "album", path: serverPath }) const imgPath = path.join(serverPath, result.imgPath) // 上傳到七牛 const qiniu = await upToQiniu(imgPath, result.imgKey) // 上存到七牛之后 刪除原來(lái)的緩存圖片 removeTemImage(imgPath) ctx.body = { imgUrl: `http://xxxxx(你的外鏈或者解析后七牛的路徑)/${qiniu.key}` } })); app.listen(3001); console.log("listening on port 3001");
然后在同一級(jí)目錄下,創(chuàng)建一個(gè)public文件夾,然后在下面新建一個(gè) index.html,因?yàn)槲覀兩厦嬉呀?jīng)把這個(gè)文件夾設(shè)置為靜態(tài)訪問(wèn)文件夾了, public/index.html 的代碼為
Document
選擇好圖片,然后點(diǎn)擊提交,就可以上傳到你的七??臻g啦!
文章博客地址: http://blog.naice.me/articles
ps: 如果對(duì)你有幫助請(qǐng)隨手丟一個(gè) start 哦
源代碼在 github: https://github.com/naihe138/k...
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/84430.html
摘要:數(shù)據(jù)遷移過(guò)程中的速率問(wèn)題。關(guān)閉源站數(shù)據(jù)遷移典型案例剖析七牛客戶陌陌的數(shù)據(jù)量非常大,如果采用常用的傳輸辦法,整個(gè)遷移過(guò)程要耗時(shí)半年,并且會(huì)嚴(yán)重影響線上的業(yè)務(wù)。為此,七牛為陌陌制定了個(gè)性化的數(shù)據(jù)遷移方案。 showImg(http://sharlyne-lee.qiniudn.com/m1.png); 無(wú)論是計(jì)劃擁抱云服務(wù)還是打算從正在使用的云服務(wù)切換到另外一家,這其中數(shù)據(jù)的遷移是很關(guān)鍵...
摘要:,在后續(xù)測(cè)試時(shí)遇到一個(gè)詭異,當(dāng)文件過(guò)大時(shí),任務(wù)腳本上傳到七牛云失敗。當(dāng)我遇到大文件無(wú)法上傳到七牛云時(shí),斷點(diǎn)調(diào)試到這里,發(fā)現(xiàn)返回的是。后來(lái)還真被我找到了,七牛云官方提供一個(gè)腳本工具。 業(yè)務(wù)場(chǎng)景 需求 我們項(xiàng)目有一個(gè)文件上傳需求,需要從客戶端上傳到七牛云的對(duì)象存儲(chǔ)和自己的應(yīng)用服務(wù)器上。這里使用七牛云主要是實(shí)現(xiàn)下載分發(fā)。應(yīng)用服務(wù)器需要留一份是因?yàn)楹罄m(xù)需要做文件分析(并且是上傳后需要立馬分析出...
摘要:如果看完此文依然不解的還想使用七牛的,請(qǐng)站內(nèi)信聯(lián)系明月,我可以收費(fèi)全套代勞,費(fèi)用不高配置快速當(dāng)天見(jiàn)效效果明顯免費(fèi)維護(hù)歡迎惠顧。 最近明月使用七牛加速自己博客初見(jiàn)成效后,也分享了不少七牛方面的經(jīng)驗(yàn),很多站長(zhǎng)也向明月咨詢了七牛方面的問(wèn)題,本著分享的精神,明月今天就當(dāng)一次義務(wù)的七牛推廣員給大家講解一番。showImg(https://segmentfault.com/img/bVMhUH?w...
摘要:如果看完此文依然不解的還想使用七牛的,請(qǐng)站內(nèi)信聯(lián)系明月,我可以收費(fèi)全套代勞,費(fèi)用不高配置快速當(dāng)天見(jiàn)效效果明顯免費(fèi)維護(hù)歡迎惠顧。 最近明月使用七牛加速自己博客初見(jiàn)成效后,也分享了不少七牛方面的經(jīng)驗(yàn),很多站長(zhǎng)也向明月咨詢了七牛方面的問(wèn)題,本著分享的精神,明月今天就當(dāng)一次義務(wù)的七牛推廣員給大家講解一番。showImg(https://segmentfault.com/img/bVMhUH?w...
摘要:基于七牛云存儲(chǔ)官方構(gòu)建。使用此構(gòu)建您的網(wǎng)絡(luò)應(yīng)用程序,能讓您以非常便捷地方式將數(shù)據(jù)安全地存儲(chǔ)到七牛云存儲(chǔ)上。應(yīng)用接入獲取和要接入七牛云存儲(chǔ),您需要擁有一對(duì)有效的和用來(lái)進(jìn)行簽名認(rèn)證。文件下載七牛云存儲(chǔ)上的資源下載分為公有資源下載和私有資源下載。 此 SDK 適用于 PHP 5.1.0 及其以上版本?;?七牛云存儲(chǔ)官方API 構(gòu)建。使用此 SDK 構(gòu)建您的網(wǎng)絡(luò)應(yīng)用程序,能讓您以非常便捷地方...
閱讀 1453·2023-04-25 19:00
閱讀 4156·2021-11-17 17:00
閱讀 1768·2021-11-11 16:55
閱讀 1526·2021-10-14 09:43
閱讀 3130·2021-09-30 09:58
閱讀 858·2021-09-02 15:11
閱讀 2128·2019-08-30 12:56
閱讀 1406·2019-08-30 11:12