이 구조에 blob 데이터가 있습니다.
Blob {type: "audio/wav", size: 655404, slice: function}
size: 655404
type: "audio/wav"
__proto__: Blob
실제로 최근 Chrome getUerMedia()
및 Recorder.js를 사용하여 녹음 된 사운드 데이터입니다.
jquery의 post 메서드를 사용하여이 blob을 서버에 어떻게 업로드 할 수 있습니까? 나는 운없이 이것을 시도했다.
$.post('http://localhost/upload.php', { fname: "test.wav", data: soundBlob },
function(responseText) {
console.log(responseText);
});
답변
이 시도
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);
});
FormData API 를 사용하고 jQuery.ajax
의 processData
및 contentType
을로 설정해야 합니다 false
.
답변
실제로 JavaScript에서 서버 FormData
로 a를 보내는 데 사용할 필요가 없습니다 Blob
(그리고 a File
도 a입니다 Blob
).
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
});
Vanilla 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 Rocks
답변
위의 예를 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);
?>
답변
FormData를 사용하지 않고 javascript 객체를 사용하여 blob을 전송하여 @yeeking 예제를 작동시킬 수있었습니다. recorder.js를 사용하여 만든 사운드 Blob과 함께 작동합니다. Chrome 버전 32.0.1700.107에서 테스트되었습니다.
function uploadAudio( blob ) {
var reader = new FileReader();
reader.onload = function(event){
var fd = {};
fd["fname"] = "test.wav";
fd["data"] = event.target.result;
$.ajax({
type: 'POST',
url: 'upload.php',
data: fd,
dataType: 'text'
}).done(function(data) {
console.log(data);
});
};
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,
$filename = $_POST['fname'];
echo $filename;
// write the data out to the file
$fp = fopen($filename, 'wb');
fwrite($fp, $decodedData);
fclose($fp);
?>
답변
2019 업데이트
이렇게하면 최신 Fetch API로 답변이 업데이트되며 jQuery가 필요하지 않습니다.
면책 조항 : IE, Opera Mini 및 이전 브라우저에서는 작동하지 않습니다. caniuse를 참조하십시오 .
기본 가져 오기
다음과 같이 간단 할 수 있습니다.
fetch(`https://example.com/upload.php`, {method:"POST", body:blobData})
.then(response => console.log(response.text()))
오류 처리로 가져 오기
오류 처리를 추가하면 다음과 같이 보일 수 있습니다.
fetch(`https://example.com/upload.php`, {method:"POST", body:blobData})
.then(response => {
if (response.ok) return response;
else throw Error(`Server returned ${response.status}: ${response.statusText}`)
})
.then(response => console.log(response.text()))
.catch(err => {
alert(err);
});
PHP 코드
이것은 upload.php의 서버 측 코드입니다.
<?php
// gets entire POST body
$data = file_get_contents('php://input');
// write the data out to the file
$fp = fopen("path/to/file", "wb");
fwrite($fp, $data);
fclose($fp);
?>
답변
위의 모든 솔루션과 관련 답변의 솔루션도 시도했습니다. Blob을 HTMLInputElement의 파일 속성에 수동으로 전달하고 FileReader의 모든 readAs * 메서드를 호출하고 FormData.append 호출에 대한 두 번째 인수로 File 인스턴스를 사용하여 blob 데이터를 문자열로 가져 오는 등의 솔루션을 포함하지만 이에 국한되지는 않습니다. URL.createObjectURL (myBlob)의 값은 불쾌하고 내 컴퓨터를 추락했습니다.
이제 그 이상을 시도했지만 여전히 blob을 업로드 할 수없는 경우 문제가 서버 측에 있음을 의미 할 수 있습니다. 제 경우에는 내 blob이 PHP.INI 의 http://www.php.net/manual/en/ini.core.php#ini.upload-max-filesize 및 post_max_size 제한을 초과 하여 파일이 프런트 엔드를 떠났습니다. 양식이지만 서버에서 거부됩니다. PHP.INI에서 직접 또는 .htaccess를 통해이 값을 늘릴 수 있습니다.