Safari 5 / Firefox 4부터는 FormData
클래스 를 사용하는 것이 가장 쉽습니다 .
var data = new FormData();
jQuery.each(jQuery('#file')[0].files, function(i, file) {
data.append('file-'+i, file);
});
이제 FormData
XMLHttpRequest와 함께 보낼 준비 가 된 객체가 있습니다.
jQuery.ajax({
url: 'php/upload.php',
data: data,
cache: false,
contentType: false,
processData: false,
method: 'POST',
type: 'POST', // For jQuery < 1.9
success: function(data){
alert(data);
}
});
jQuery가 헤더 를 추가하지 않도록 contentType
옵션을 설정해야 합니다. 그렇지 않으면 경계 문자열이 누락됩니다. 또한 플래그를 false로 설정 해야합니다 . 그렇지 않으면 jQuery가 문자열을 문자열 로 변환하려고 시도하므로 실패합니다.false
Content-Type
processData
FormData
다음을 사용하여 PHP에서 파일을 검색 할 수 있습니다.
$_FILES['file-0']
( 파일 입력에 속성을 file-0
지정하지 않으면 파일 하나만 있습니다.이 multiple
경우 각 파일마다 숫자가 증가합니다.)
이전 브라우저에 FormData 에뮬레이션 사용
var opts = {
url: 'php/upload.php',
data: data,
cache: false,
contentType: false,
processData: false,
method: 'POST',
type: 'POST', // For jQuery < 1.9
success: function(data){
alert(data);
}
};
if(data.fake) {
// Make sure no text encoding stuff is done by xhr
opts.xhr = function() { var xhr = jQuery.ajaxSettings.xhr(); xhr.send = xhr.sendAsBinary; return xhr; }
opts.contentType = "multipart/form-data; boundary="+data.boundary;
opts.data = data.toString();
}
jQuery.ajax(opts);
기존 양식에서 FormData 작성
파일을 수동으로 반복하는 대신 기존 양식 객체의 내용으로 FormData 객체를 만들 수도 있습니다.
var data = new FormData(jQuery('form')[0]);
카운터 대신 PHP 기본 배열을 사용하십시오.
파일 요소 이름을 동일하게 지정하고 이름을 대괄호로 끝내십시오.
jQuery.each(jQuery('#file')[0].files, function(i, file) {
data.append('file[]', file);
});
$_FILES['file']
그러면 업로드 된 모든 파일의 파일 업로드 필드가 포함 된 배열이됩니다. 실제로 반복하는 것이 더 간단하므로 초기 솔루션보다 이것을 권장합니다.