tumobi / nideshop

NideShop 开源微信小程序商城服务端 API(Node.js + ThinkJS)
https://www.nideshop.com/
MIT License
5.55k stars 1.78k forks source link

admin/brand/upload 上传无法接收到上传文件 #3

Closed chekn closed 7 years ago

chekn commented 7 years ago
async uploadAction() {
        let brandFile = this.file('brand_pic');
        if (think.isEmpty(brandFile)) {
            return this.fail('保存失败');
        }
        let that = this;
        let filename = '/static/brand/' + think.uuid(32) + '.jpg';
        gm(brandFile.path)
            .resize(750, 420, "!")
            .write(think.RESOURCE_PATH + filename, function (err) {
                if (err) {
                    that.fail('图片上传失败');
                }
                that.success({
                    fileUrl: '' + filename
                });
            });
    }

这部分执行有问题 Linux服务器 执行gm.write 方法, 回调参数 err 是一个空对象,出错信息不明,不知道到底是哪里出错了。 查看 www 下的 brand 文件夹, 也没有刚上传的文件

JO-WTF commented 7 years ago

在nideshop目录运行pm2 stop nideshop

修改该文件 在图片上传失败前添加:console.log(err);

保存后运行:npm start

重新上传图片,然后把错误提示发出来。

chekn commented 7 years ago

对 pm2 这个命令不清楚,使用shell 执行也shell也说找不到,但看意识是停掉,就ctrl+c停了 然后打印发现有报错,(输出空对象的原因: 之前用的JSON.stringify(err) 输出到 response 就变成了 {})。

控制台输出 控制台输出

前台发送内容 前台发送内容

thinkjs 没有存临时文件

chekn commented 7 years ago

查是不是磁盘权限原因,这是的改的代码

async uploadAction(){

    let brandFile = this.file('brand_pic');
    if (think.isEmpty(brandFile)) {
        return this.fail('store fail......');
    }
    let that = this;
    let filename = '/static/brand/' + think.uuid(32) + '.jpg';
    if(fs.exists(brandFile.path))
        gm(brandFile.path)
                .resize(750, 420, "!")
                .write(think.RESOURCE_PATH + filename, function (err) {
                    if (err) {
                        that.fail("store procession fail.." );
                    } 
                    that.success({
                        fileUrl: '' + filename
                    });
                });
    else{
        var n=null;
        var cmd= process.execSync('whoami');
        console.info( "who hold this " + (n=cmd) );
        return this.fail("have no file in thinkjs upload tmp dir.. [][] i am "+ n);
    }
}

终端 shell 发现打印的是 who hold this root, 这样就不是权限导致的无法写问题。

chekn commented 7 years ago

问题已解决,之前不冷静,没有仔细看出错信息,以为是 图片文件 没找到 下面是问题解决过程

  1. 确认是不是thinkjs 的问题,在使用 inotifywait 监控runtime/upload 文件后,确认文件被 thinkjs 接收。
  2. 确认代码执行过程,接着发现 fs.exists 执行结果是 undefined, 怀疑 JS 代码引入使用有问题,去查了下,发现fs 包,存在同步和异步的方法,改方法名fs.existsSync,图片存在验证结果符合预期
  3. 疑惑gm 为什么执行出错,执行看 Error 信息,报错的意识是 一个命令没有找到,网上查这个most like gm/convet... 这段出错信息, 确认是 确实确少 GraphicsMagick , ImageMagick 包没有。 我的操作系统是 centos 6.5, 使用yum 库安装
    yum install GraphicsMagick -y
    yum install ImageMagick -y 

    重试确认问题解决