通过ajax传递Blob以生成文件

26

我正在尝试捕获audiorecorder (https://github.com/cwilso/AudioRecorder) 并通过Ajax将blob发送到一个php文件中,该文件将接收blob内容并创建文件(在这种情况下是波形文件)。

Ajax调用:

audioRecorder.exportWAV(function(blob) {
      var url = (window.URL || window.webkitURL).createObjectURL(blob);
      console.log(url);
      var filename = <?php echo $filename;?>;
      $.ajaxFileUpload({
        url :  "lib/vocal_render.php",
        secureuri      :false,
        dataType : blob.type,
        data: blob,
        success: function(data, status) {
          if(data.status != 'error')
            alert("boa!");
        }
      });
    }); 

我的php文件(vocal_render.php):

<?php 

if(!empty($_POST)){
    $data = implode($_POST); //transforms the char array with the blob url to a string
    $fname = "11" . ".wav";

    $file = fopen("../ext/wav/testes/" .$fname, 'w');
    fwrite($file, $data);
    fclose($file);
}?>

附言:我对Blob和Ajax都是新手。 提前感谢。

3个回答

38

尝试将文件作为表单数据上传

audioRecorder.exportWAV(function(blob) {

      var url = (window.URL || window.webkitURL).createObjectURL(blob);
      console.log(url);

      var filename = <?php echo $filename;?>;
      var data = new FormData();
      data.append('file', blob);

      $.ajax({
        url :  "lib/vocal_render.php",
        type: 'POST',
        data: data,
        contentType: false,
        processData: false,
        success: function(data) {
          alert("boa!");
        },    
        error: function() {
          alert("not so boa!");
        }
      });
}); 

.

<?php 

if(isset($_FILES['file']) and !$_FILES['file']['error']){
    $fname = "11" . ".wav";

    move_uploaded_file($_FILES['file']['tmp_name'], "../ext/wav/testes/" . $fname);
}
?>

1
它是否也可以在没有“FormData”的情况下工作?这样就可以使用图像MIME类型发送它了吗? - Benny Code
1
@BennyNeugebauer 你可以直接将它发送为文件或 Blob,但是在服务器上需要以不同的方式处理它。 - Musa
1
我一整天都在寻找解决方案,尝试了很多不同的方法,但这是第一个有效的!谢谢! - Jeff
这将创建一个multipart/form-data请求,这可能不是理想或必需的。 - undefined

3
根据文档,通过使用XMLHttpRequest.send(),您可以直接使用Blob对象。
var blob = new Blob(chunks, { 'type' : 'audio/webm' });
var xhr = new XMLHttpRequest();
xhr.open('POST', '/speech', true);
xhr.onload = function(e) {
  console.log('Sent');
};
xhr.send(blob);

我尝试过这个方法,效果非常好。


0

在Laravel Blade中进行AJAX调用并生成CSV文件以供下载

<button type="button" class="btn btn-primary" id="download-btn">Download</button>

<script>
    $(document).on('click', '#download-btn', function(e) {
        e.preventDefault();
        $.ajax({
            "url": "{{ config('app.api_link').'/import/lc-register-report?download=yes' }}",
            "type": "POST",
            xhrFields:{
                responseType: 'blob'
            },
            data: { },
            headers: {
                'Authorization': "Bearer {{ Session::get('authorization_token') }}"
            },
            success: function(response) 
            {
                var data = new Blob([response], {type: 'application/vnd.ms-excel'}); // csv = 'text/csv'
                var csvURL = window.URL.createObjectURL(data);
                const tempLink = document.createElement('a');
                tempLink.href = csvURL;
                tempLink.setAttribute('download', 'transaction-report.xls'); // csv = '.csv'
                tempLink.click();
            }
        });
    });
</script>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接