Mam dane blob w tej strukturze:
Blob {type: "audio/wav", size: 655404, slice: function}
size: 655404
type: "audio/wav"
__proto__: Blob
W rzeczywistości są to dane dźwiękowe nagrane przy użyciu najnowszego Chrome getUerMedia()
i Recorder.js.
Jak mogę przesłać ten obiekt BLOB na serwer przy użyciu metody publikowania w jquery? Próbowałem tego bez szczęścia:
$.post('http://localhost/upload.php', { fname: "test.wav", data: soundBlob },
function(responseText) {
console.log(responseText);
});
javascript
jquery
html
Yang
źródło
źródło
Odpowiedzi:
Spróbuj tego
Musisz użyć interfejsu API FormData i ustawić wartości
jQuery.ajax
'sprocessData
orazcontentType
tofalse
.źródło
$('input[type=file]').value=blob
W rzeczywistości nie musisz używać
FormData
do wysyłania aBlob
do serwera z JavaScript (aFile
jest również aBlob
).Przykład jQuery:
Przykład Vanilla JavaScript:
To prawda, jeśli zastępujesz tradycyjny formularz wieloczęściowy HTML implementacją „AJAX” (to znaczy, że zaplecze zużywa dane formularza wieloczęściowego), chcesz użyć
FormData
obiektu w sposób opisany w innej odpowiedzi.Źródło: Nowe sztuczki w XMLHttpRequest2 | HTML5 Rocks
źródło
Nie mogłem uzyskać powyższego przykładu do pracy z obiektami blob i chciałem wiedzieć, co dokładnie znajduje się w pliku upload.php. A więc proszę:
(testowane tylko w Chrome 28.0.1500.95)
Zawartość upload.php:
źródło
data: fd,
wajax
wywołaniu funkcji nadata: blob,
.Udało mi się uzyskać przykład @yeeking, aby działał, nie używając FormData, ale używając obiektu javascript do przesyłania obiektu blob. Działa z dźwiękowym blobem utworzonym za pomocą pliku recorder.js. Przetestowano w Chrome w wersji 32.0.1700.107
Zawartość upload.php
źródło
Aktualizacja 2019
To aktualizuje odpowiedzi za pomocą najnowszego interfejsu API pobierania i nie wymaga jQuery.
Uwaga: nie działa w IE, Opera Mini i starszych przeglądarkach. Zobacz caniuse .
Podstawowe pobieranie
Może to być tak proste, jak:
Pobierz z obsługą błędów
Po dodaniu obsługi błędów mogłoby to wyglądać następująco:
Kod PHP
To jest kod po stronie serwera w upload.php.
źródło
Wypróbowałem wszystkie powyższe rozwiązania, a ponadto te w powiązanych odpowiedziach. Rozwiązania obejmujące między innymi ręczne przekazanie obiektu blob do właściwości file HTMLInputElement, wywołanie wszystkich metod readAs * w FileReader, użycie wystąpienia File jako drugiego argumentu dla wywołania FormData.append, próba pobrania danych obiektu BLOB jako ciągu przez pobranie wartości w URL.createObjectURL (myBlob), które okazały się nieprzyjemne i spowodowały awarię mojego komputera.
Teraz, jeśli zdarzy ci się spróbować tych lub więcej i nadal okaże się, że nie możesz przesłać swojego obiektu BLOB, może to oznaczać, że problem występuje po stronie serwera. W moim przypadku mój blob przekroczył http://www.php.net/manual/en/ini.core.php#ini.upload-max-filesize i post_max_size limit w PHP.INI, więc plik opuszczał front-end formularz, ale został odrzucony przez serwer. Możesz zwiększyć tę wartość bezpośrednio w PHP.INI lub przez .htaccess
źródło