2013-06-26 49 views
1

我正在使用Force.com Apex和VF试图利用Cloudinary进行一些内容管理。我卡上的Chrome以下(不知道为什么会出现“未定义”作为云名称被JS定义):Cloudinary jQuery上传授权

POST https://api.cloudinary.com/v1_1/undefined/upload 401 (Unauthorized) ...... api.cloudinary.com/v1_1/undefined/upload:1 

在无奈的点会很感激的任何援助。下面的代码(附注注释):

  • 的APEX

public String getCldSig() { 

     Datetime d = datetime.now(); 
     Long uxtime = d.getTime()/1000; //method provides epoch/unix time 
     String apisec = '<some_secret>'; 
     String serial = 'callback=<some_url>&public_id=<some_id>&timestamp=' + uxtime + apisec; 
     Blob sha = Crypto.generateDigest('SHA1', Blob.valueOf(serial)); 
     String sig = EncodingUtil.convertToHex(sha); //perhaps I need to do UTF-8 
     String jsoSerial = '{"public_id":"<some_Id>",'; 
     jsoSerial += '"timestamp":"'+ uxtime + '",'; 
     jsoSerial += '"callback":"<some_url>",'; //maybe an issue with hosting the CORS html on a VF page. 
     jsoSerial += '"signature":"' + sig + '",'; 
     jsoSerial += '"api_key":"<some_key>"}'; 
     return jsoSerial.escapeHtml3(); //seems to be the right escape output HTML 
} 
  • 的JavaScript/jQuery的:

       $.cloudinary.config({"api_key":"<some_key>", "cloud_name":"<some_id>"});      
           $('.cloudinary-fileupload') 
            .fileupload({ 
            dropZone: ".sceneUpBtn", 
            progress: function (e, data) { 
             $(".progress").text("Uploading... " + Math.round((data.loaded * 100.0)/data.total) + "%"); 
            } 
            }); 
           $('.cloudinary-fileupload').bind('fileuploadstart', function(e){ 
            $('.sceneUpPrev').html('Upload started...'); 
           });      
           $('.cloudinary-fileupload').bind('fileuploadfail', function(e){ 
            $('.sceneUpPrev').html($.cloudinary.error); //**due to lack of documentation don't know how to get any specific error message using the jQuery library. Would expect messages similar to AWS S3 
           });  
           $('.cloudinary-fileupload').bind('cloudinarydone', function(e, data) { 
            $('.sceneUpPrev').html(
             $.cloudinary.image(data.result.public_id, 
              { format: data.result.format, version: data.result.version, 
              crop: 'scale', width: 200 }));  
            $('.image_public_id').val(data.result.public_id);  
            return true; 
           }); 
    

输入HTML:

<input class="cloudinary-fileupload" 
data-cloudinary-field="upref" 
data-form-data="&quot;public_id&quot;:&quot;<some_id>&quot;,&quot;timestamp&quot;:&quot;1372282433&quot;,&quot;callback&quot;:&quot;<some_url>&quot;,&quot;signature&quot;:&quot;<some_sig>&quot;,&quot;api_key&quot;:&quot;<some_key>&quot;}" 
id="sceneUpload" 
name="file" 
type="file"> 

回答

1

在Tal Cloudinary的帮助下,我获得了成功!我会回顾一下解决方案:

  1. 不要实例Cloudinary在$(文件)库。就绪(),而不仅仅是直接在脚本部分

    <script type="text/javascript">    
        $.cloudinary.config({"api_key":"<key>","cloud_name":"<cloud_name>"}); 
    
  2. 实例化FORMDATA插上 与FileUpload小部件,这确保fileUpload
    加载您的json发送参数(这是一个时间问题)。

        $('.cloudinary-fileupload').fileupload({ 
             formData : <unescaped json params>, 
             dropZone: $('.sceneUpBtn'),        
             dataType: 'json', 
             done: function (e, data) { 
              $.each(data.result.files, function (index, file) { 
               $('<p/>').text(file.name).appendTo('#filename'); 
              }); 
              }, 
             progressall: function (e, data) { 
              var progress = parseInt(data.loaded/data.total * 100, 10); 
              $('.sceneUpBar').css('width',progress + '%'); 
             } 
           }); 
    
  3. 将签名参数匹配到发送给服务器的json参数。在顶点的标志,并返回JSON这样:

    public String getCloudinarySig() { 
        Datetime d = datetime.now(); 
        Long uxtime = d.getTime()/1000; //epoch unix time method in force.com 
        String apisec = '<secret>'; 
        String serial = 'callback=<cors url>&timestamp=' + uxtime + apisec; //Signature needs params here need to match json params below 
        Blob sha = Crypto.generateDigest('SHA1', Blob.valueOf(serial)); //Sha1 digest 
        String sig = EncodingUtil.convertToHex(sha); //Hex conversion 
        String jsoSerial = '{'; 
        jsoSerial += '"api_key":"<key>",'; //these json params need to match signature params above  
        jsoSerial += '"<CORS_url>",';     
        jsoSerial += '"signature":"' + sig + '",'; 
        jsoSerial += '"timestamp":'+ uxtime; 
        jsoSerial += '}'; 
        return jsoSerial;  
    

    }

乐意回答任何问题......

+0

你能解释一下你的第二点吗?你有没有尝试动态填充JSON参数,或者你是否在页面加载中实例化它们? – IvanR

+1

我最初的错误是将JSON参数直接填充到INPUT的“数据表单数据”属性中。在设置“data-form-data”之前,FileUpload小部件正在进行实例化,结果认证失败,因为“data-form-data”在传递给Cloudinary时是空白的。 要解决这个问题,您不应该填充“data-form-data”,而应该在加载FileUpload小部件时填充“formData”参数(相同的区别)。 –

+0

谢谢,我直接更新data-form-data属性时也犯了同样的错误。我只想为那些只在栈溢出处寻找答案并且不读文档的懒惰程序员添加唯一的东西 - 'fileupload'函数中的'formData'参数需要JSON哈希(或JavaScript对象)和** NOT * *一个序列化的JSON字符串 – IvanR

2

文章网址的“不确定”部分是指Cloudinary的jQuery库无法确定cloud_name生成帖子网址时。 这很可能是因为$ .cloudinary.config函数调用得太晚。请将此调用移至$(document).ready或类似结构之外。

多一个(无关)点 - 第二行中的选择器缺少'。'它应该读$('。cloudinary-fileupload')

+0

谢谢你,让我纠正至少取得了一些进展两点,但我仍然从Chrome收到: 无法加载资源:服务器响应的状态为401(未授权)https://api.cloudinary.com/v1_1/ /upload –

+0

也可以提供确切的顺序所有的基地js包括必需的。 –

+0

我看到的更多错误: 1)输入字段的名称应该是文件(不是文件)。 2)数据表单数据是如何初始化的?它在JS中还是在HTML中?如果在JS中可以发送用于执行初始化的代码? 你可以发布完整的HTML生成的要点吗? –