123

私はこの構造にブロブデータを持っています:

Blob {type: "audio/wav", size: 655404, slice: function}
size: 655404
type: "audio/wav"
__proto__: Blob

実際に最近のChromegetUerMedia()Recorder.jsを使って録音した音データです

jquery の post メソッドを使用して、このブロブをサーバーにアップロードするにはどうすればよいですか? 私は運なしでこれを試しました:

   $.post('http://localhost/upload.php', { fname: "test.wav", data: soundBlob }, 
    function(responseText) {
           console.log(responseText);
    });
4

6 に答える 6

141

FormData APIを使用できます。

を使用している場合はjquery.ajax、 と を設定する必要がありprocessData: falseますcontentType: false

var fd = new FormData();
fd.append('fname', 'test.wav');
fd.append('data', soundBlob);
$.ajax({
    type: 'POST',
    url: '/upload.php',
    data: fd,
    processData: false,
    contentType: false
}).done(function(data) {
       console.log(data);
});
于 2012-11-11T17:17:28.573 に答える
22

実際には、JavaScript からサーバーFormDataに a を送信するためにを使用する必要はありません(また、aも です)。BlobFileBlob

jQuery の例:

var file = $('#fileInput').get(0).files.item(0); // instance of File
$.ajax({
  type: 'POST',
  url: 'upload.php',
  data: file,
  contentType: 'application/my-binary-type', // set accordingly
  processData: false
});

バニラ JavaScript の例:

var file = $('#fileInput').get(0).files.item(0); // instance of File
var xhr = new XMLHttpRequest();
xhr.open('POST', '/upload.php', true);
xhr.onload = function(e) { ... };
xhr.send(file);

確かに、従来の HTML マルチパート フォームを「AJAX」実装に置き換える場合 (つまり、バックエンドがマルチパート フォーム データを使用する場合)、FormData別の回答で説明されているようにオブジェクトを使用する必要があります。

ソース: XMLHttpRequest2 の新しいトリック | HTML5 ロックス

于 2015-11-23T23:11:37.560 に答える
19

上記の例を blob で動作させることができなかったので、upload.php の正確な内容を知りたいと思いました。だからここに行く:

(Chrome 28.0.1500.95 でのみテスト済み)

// javascript function that uploads a blob to upload.php
function uploadBlob(){
    // create a blob here for testing
    var blob = new Blob(["i am a blob"]);
    //var blob = yourAudioBlobCapturedFromWebAudioAPI;// for example   
    var reader = new FileReader();
    // this function is triggered once a call to readAsDataURL returns
    reader.onload = function(event){
        var fd = new FormData();
        fd.append('fname', 'test.txt');
        fd.append('data', event.target.result);
        $.ajax({
            type: 'POST',
            url: 'upload.php',
            data: fd,
            processData: false,
            contentType: false
        }).done(function(data) {
            // print the output from the upload.php script
            console.log(data);
        });
    };      
    // trigger the read from the reader...
    reader.readAsDataURL(blob);

}

upload.php の内容:

<?
// pull the raw binary data from the POST array
$data = substr($_POST['data'], strpos($_POST['data'], ",") + 1);
// decode it
$decodedData = base64_decode($data);
// print out the raw data, 
echo ($decodedData);
$filename = "test.txt";
// write the data out to the file
$fp = fopen($filename, 'wb');
fwrite($fp, $decodedData);
fclose($fp);
?>
于 2013-08-15T14:24:01.747 に答える