2017-09-12 23 views
0

我还是设法将文件上传到谷歌存储用GCP可恢复上传(JSON API): https://cloud.google.com/storage/docs/json_api/v1/how-tos/resumable-uploadGoogle云端平台存储JSON API上传打破了音频文件..?!怎么修?

使用jQuery和Plupload http://www.plupload.com

但现在看来,音频文件丢失了自己的编解码器上传和那些赢了不玩或ffmpeg不能探测这些。更多的测试表明,实际上.flac文件对于ffmpeg是可以的,但是例如.m4a文件不是。

我需要得到大多数上传至谷歌存储的音频文件,并能够探测那些ffmpeg的。并且必须能够上传超过100Mb的大文件。这就是为什么我相信JSON API是最好的或唯一可行的方式。

我想我有元数据也添加正确,但现在我很困惑如何继续.. 任何想法可能是什么问题在这里?

EDIT(详细信息):

我曾工作的软件:

  • 使用常规的POST>/TEMP>谷歌云存储客户端(PHP)。
  • GCP存储客户端上传完美的文件。
  • 即使是我命名上传的文件中包含“woeiwehf.tmp”随机唯一的名称,那些没有工作和ffmpeg的可以探讨他们的罚款。

THEN发生了一件事,我想上传这样被限制(或东西):

  • 什么意思,我的解决方案不能再上传大文件,超过32MB。

  • 嗯,这是不是最好的解决办法,无论如何,让有什么?,这改变了。

NOW:

  • 我已经改变了软件,所以它使用JSON GCP API上传断点续传,这主要是工程
  • 但我不得不改变文件看起来像“woeiwehf.flac “或者类型是什么。 “.tmp”不再有效。
  • 例如.FLAC文件的工作很好,但.m4a的不会。
  • 我测试过上传许多不同的方式,它似乎是JSON API上传至少损失编解码器和比特率。

-

我会很感激,如果我能得到帮助如何解决这个问题。 我想一个解决方案可能是叉ffmpeg客户端和手动设置音频编解码器,但我保存了最后的解决方案。

+0

您是否试图使用浏览器访问上传的文件?如果是这样,那么您在元数据上为无法正确播放的文件设置了哪种内容类型? –

+0

@MikeSchwartz我在GCP存储中使用浏览器测试了文件。当你手动上传文件到存储器时,它会设置“audio/x-m4a”Content-Type(这些工作),所以我在软件上传时强制这样做。它位于标题“X-Upload-Content-Type”中。 Plupload会自动尝试使用“audio/mp4”,但它不起作用。 – Zolai

+0

我不清楚你的回答是否仍有问题。听起来好像你在说将Content-Type设置为audio/x-m4a。 –

回答

0

1。POST请求,谷歌JSON API必须完全为谷歌文档称

(例如:https://cloud.google.com/storage/docs/json_api/v1/how-tos/resumable-upload

最后我做到了与回答工作从这样一个问题: Upload file to Google cloud storage from Google App Engine (Java)

由于用户https://stackoverflow.com/users/3371862/renaud-t

function uploadFile(fileData, bucket) { 
    var boundary = '-------314159265358979323846'; 
    var delimiter = "\r\n--" + boundary + "\r\n"; 
    var close_delim = "\r\n--" + boundary + "--"; 
    var reader = new FileReader(); 
    reader.readAsBinaryString(fileData); 

    reader.onload = function (e) { 
     var contentType = fileData.type || 'application/octet-stream'; 
     var metadata = { 
      'name': fileData.name, 
      'mimeType': contentType 
     }; 
     var base64Data = btoa(reader.result); 
     var multipartRequestBody = 
       delimiter + 
       'Content-Type: application/json\r\n\r\n' + 
       JSON.stringify(metadata) + 
       delimiter + 
       'Content-Type: ' + contentType + '\r\n' + 
       'Content-Transfer-Encoding: base64\r\n' + 
       '\r\n' + 
       base64Data + 
       close_delim; 

     var request = gapi.client.request({ 
      'path': '/upload/storage/v1/b/' + bucket + '/o', 
      'method': 'POST', 
      'params': {'uploadType': 'multipart'}, 
      'headers': { 
       'Content-Type': 'multipart/mixed; boundary="' + boundary + '"' 
      }, 
      'body': multipartRequestBody 
     }); 

     try { 
      request.execute(function (resp) { 
       if (resp.hasOwnProperty("error")) { 
        //Treat Error 
       } else { 
        //Treat Success 
       } 
      }); 
     } 
     catch (e) { 
      //Treat Error 
     } 

    }; 

} 

2.使用谷歌API客户端库中的JavaScript

https://developers.google.com/api-client-library/javascript/start/start-js

GAPI客户指南说你应该使用“then”方法,所以我改变了上面的代码。

var request = gapi.client.request({ 
    'path': url, 
    'method': 'POST', 
    'params': {'uploadType': 'multipart'}, 
    'headers': { 
    'Content-Type': 'multipart/mixed; boundary="' + boundary + '"' 
    }, 
    'body': multipartRequestBody 
}).then(function(response) { 
    // Handle response 
    }, function(reason) { 
    // Handle error 
    } 
); 
相关问题