2017-09-12 36 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 
    } 
);