bluebird 实现上传图片。发现了一个坑有没有更多的?重新贴了一下代码
发布于 5 年前 作者 koroshi 3155 次浏览 最后一次编辑是 4 年前 来自 问答

功能上传图片,检查文件夹是否存在, **主要问题: express的req好像被赋予其他对象会丢失所以只能一层一层传下去 主要就是req 可以被form.parse 但是如果option.req = req 之后就报错了 ** 重修贴一下代码加一些注释。 **错误信息 POST /upload/meetingPhoto/561c700e7435be1a33cba428/10 - - ms - - not success [TypeError: Cannot read property ‘headers’ of undefined] ** 代码如下

path = require 'path'
formidable =require "formidable"
TMP_DIR = "public/tmp"
fs = require "fs"
Promise = require 'bluebird'
Promise.promisifyAll(fs)
meetingId = ''
index = ''
meetingPath = ''

MeetingPhoto = (myreq) ->
# 入口
  meetingId = myreq.params.meetingId
  index = myreq.params.index
  meetingPath = path.join($WEBPATH,"/public/meetingPhoto/#{meetingId}")
  return checkMeetingPath(meetingPath,myreq)
  .then upload
  .then renameAsync


checkMeetingPath = (meetingPath,myreq)->
# 检查文件夹是否存在或者被文件名占用
  notExists = (exists)->
#   如果文件名不存在就创建
    return fs.mkdirAsync(meetingPath)
  isExists = (exists)->
#    如果文件名存在,检查是不是文件夹
    return fs.statAsync(meetingPath)
    .then isDirectory
  isDirectory = (stats)->
#   检查是否文件夹
    if stats.isDirectory()
#     是文件夹世界resole Promise
      return Promise.resolve()
    else
#     不是文件夹删文件并且调用创建
      return fs.unlinkAsync(meetingPath)
      .then notExists

  success = ()->
#   整个过程都成功通知下一个promise 并且把req传过去
    return Promise.resolve(myreq)

  return fs.existsAsync(meetingPath)
  .then notExists
  .catch isExists
  .then success

renameAsync = (orgPath)=>
# 上传结束,移动到指定目录
  savePath = path.join meetingPath, "#{index}.jpg"
  return fs.renameAsync orgPath, savePath



upload = (upReq)->
# 上传图片
# 修改成这样
#  option = {req:upReq}
# 修改成这样
  return new Promise (resolve,reject)->
    form = new formidable.IncomingForm()
    form.encoding = 'utf-8'
    form.uploadDir = TMP_DIR
    form.keepExtensions = true
    # 修改成这样
    #form.parse option.upReq, (err, fields, files) ->
    # 修改成这样
    # 被修改的部分
    form.parse upReq, (err, fields, files) ->
    # 被修改的部分
      return reject {status:'fail',message:'上传失败,files不存在'} unless files?
      return reject {status:'fail',message:'上传失败,err in form parse'}  if err?
      file = files['file']
      return reject {status:'fail',message:'上传失败,file不存在'}  unless file?
      return resolve file.path

module.exports = MeetingPhoto

``` ![untitled1.png](//static.cnodejs.org/Fli2HT4ZTDv9gg9-Ak2B103tJVrM) ![untitled2.png](//static.cnodejs.org/FipGtr89ft5sfP0pBbJkSFNz3Q68)
4 回复

天书一样的代码

天书一样的代码+1

@yakczh 修改了一下- -主要是req那个问题我改了一下,问题应该清晰一点了

很清爽的代码

回到顶部