Sailjs从POST参数获取文件数据并上传到Cloudinary

时间:2015-07-22 09:13:56

标签: ios node.js sails.js cloudinary

我有一个基本的Sailsjs应用程序,我正在学习,我已经设法使用以下代码获得使用Cloudinary的图像上传器:

/**
 * FileController
 *
 * @description :: Server-side logic for managing files
 * @help        :: See http://sailsjs.org/#!/documentation/concepts/Controllers
 */

var cloudinary = require('cloudinary');

module.exports = {
    upload: function(req, res) {

        console.log('Request params = ' + req.params);

        var uploadFile = req.file('uploadFile');

        if(uploadFile)
        {
            console.log('Upload file = ' + uploadFile.fd);
        }

        uploadFile.upload(function onUploadComplete(err, files) {
            if(err) {
                return res.serverError(err);
            }
            else if(files.length === 0) {
                return res.badRequest('No file was uploaded.');
            }
            else {

                var imageFile = files[0];

                console.log("image path = " + imageFile.fd);

                console.log('Uploading to Cloudinary, file with path = ' + imageFile.fd + '....');

                // -----------------------------------------------------------------------------
                // Using Cloudinary CDN to handle image uploading
                // -----------------------------------------------------------------------------        
                cloudinary.uploader.upload(imageFile.fd, function(result) {

                    console.log('Finished uploading to Cloudinary, response = %j', result);

                    res.json(result);

                });
            }
        });
    }
};

这样做的唯一问题是我基本上上传了两次图像。

我的iOS应用程序第一次将图像上传到我的Sailsjs(Nodejs框架)服务器。

完成上传到我的服务器后,它会从文件路径中获取上传的文件,然后将其上传到Cloudinary CDN。

那是两次上传......

我觉得这不是正确的做法,但我没有看到任何其他方式。

是否有可能以某种方式获取我从我的iOS应用程序发送到我的Sailsjs服务器的POST参数并直接上传到Cloudinary?

我已尝试使用req.file,但它说undefined,我认为这是因为文件从我的iOS应用程序流式传输到服务器,并且在达到我的Sailsjs控制器上传功能时无法立即使用

Cloudinary确实提供了iOS SDK,但这会绕过我的服务器,这意味着我无法将用户帐户绑定到个人资料图片(例如图片的网址),对吧?

更新1

嗯,好的,根据这个文件:

http://cloudinary.com/documentation/node_image_upload

它表示要生成签名:

  

上面提到的上传示例允许您的服务器端节点代码   将图像上传到Cloudinary。在此流程中,如果您有一个Web表单   这允许您的用户上传图像,首先发送图像数据   到您的服务器,然后才上传到Cloudinary。

     

更高效,更强大的选项是允许您的用户上传   图像直接从浏览器到Cloudinary而不是去   通过您的服务器。此方法允许更快的上载和   更好的用户体验。它还可以减少服务器的负载   降低了Node.js应用程序的复杂性。

     

使用Cloudinary的jQuery直接从浏览器上传   插入。 确保所有上传内容均已获得您的授权   应用程序,必须首先在您的应用程序中生成安全签名   服务器端Node.js代码

需要进行更多调查......

Hurmmmm,这带来了将图像上传到Amazon S3的痛苦回忆,这是Cloudinary使用的。

我记得的步骤是:

  1. 在服务器上请求已签名的上传网址
  2. 服务器将包含签名URL的JSON返回给iOS应用
  3. iOS应用创建分块请求流以将图像上传到服务器
  4. T_T

1 个答案:

答案 0 :(得分:2)

如果您愿意,Cloudinary还支持直接(客户端)上传,而无需签名。欲获得更多信息: http://cloudinary.com/blog/direct_upload_made_easy_from_browser_or_mobile_app_to_the_cloud