Tenho um blob de dados nesta estrutura:
Blob {type: "audio/wav", size: 655404, slice: function}
size: 655404
type: "audio/wav"
__proto__: Blob
Na verdade, são dados de som gravados usando o recente Chrome getUerMedia()
e Recorder.js
Como posso fazer upload desse blob para o servidor usando o método de postagem do jquery? Eu tentei isso sem sorte:
$.post('http://localhost/upload.php', { fname: "test.wav", data: soundBlob },
function(responseText) {
console.log(responseText);
});
javascript
jquery
html
Yang
fonte
fonte
Respostas:
Tente isto
Você precisa usar a API FormData e definir o
jQuery.ajax
'sprocessData
econtentType
comofalse
.fonte
$('input[type=file]').value=blob
Na verdade, você não precisa
FormData
enviar umBlob
para o servidor a partir de JavaScript (e aFile
também é umBlob
).Exemplo jQuery:
Exemplo de Vanilla JavaScript:
Concedido, se você estiver substituindo um formulário HTML tradicional com várias partes por uma implementação "AJAX" (ou seja, seu back-end consome dados do formulário com várias partes), você deseja usar o
FormData
objeto conforme descrito em outra resposta.Fonte: Novos truques em XMLHttpRequest2 | HTML5 Rocks
fonte
Não consegui fazer o exemplo acima funcionar com blobs e queria saber o que exatamente está em upload.php. Então aqui está:
(testado apenas no Chrome 28.0.1500.95)
O conteúdo de upload.php:
fonte
data: fd,
naajax
chamada de função paradata: blob,
.Consegui fazer o exemplo @yeeking funcionar não usando FormData, mas usando um objeto javascript para transferir o blob. Funciona com um blob de som criado usando recorder.js. Testado no Chrome versão 32.0.1700.107
Conteúdo de upload.php
fonte
Atualização de 2019
Isso atualiza as respostas com a API Fetch mais recente e não precisa do jQuery.
Aviso de isenção de responsabilidade: não funciona no IE, Opera Mini e navegadores mais antigos. Veja caniuse .
Busca Básica
Pode ser tão simples como:
Buscar com tratamento de erros
Depois de adicionar o tratamento de erros, pode ficar assim:
Código PHP
Este é o código do lado do servidor em upload.php.
fonte
Tentei todas as soluções acima e, além disso, aquelas em respostas relacionadas também. Soluções incluindo, mas não se limitando a, passar o blob manualmente para uma propriedade de arquivo HTMLInputElement, chamando todos os métodos readAs * em FileReader, usando uma instância de File como segundo argumento para uma chamada FormData.append, tentando obter os dados de blob como uma string obtendo os valores em URL.createObjectURL (myBlob) que resultaram desagradáveis e travaram minha máquina.
Agora, se por acaso você tentar esses ou mais e ainda descobrir que não consegue fazer upload do seu blob, isso pode significar que o problema está no servidor. No meu caso, meu blob excedeu o limite de http://www.php.net/manual/en/ini.core.php#ini.upload-max-filesize e post_max_size no PHP.INI, então o arquivo estava saindo do front end formulário, mas sendo rejeitado pelo servidor. Você pode aumentar este valor diretamente no PHP.INI ou via .htaccess
fonte