JQuery AJAX отправляет массив файлов из формы
Я получил этот код где-то, чтобы загрузить фото без обновления браузера. Однако мне не понравился файл загрузчика, поэтому я решил использовать старый, с которым работал. Проблема в том, что он отправляет массив вместо строки из файла javascript (он предназначен для отправки нескольких файлов вместо одного). Вот код, который делает массив:
input.addEventListener("change", function (evt) {
document.getElementById("response").innerHTML = "Loading . . ."
var i = 0, len = this.files.length, img, reader, file;
for ( ; i < len; i++ ) {
file = this.files[i];
if (formdata) {
formdata.append("uploaded_file[]", file);
} } }
if (formdata) {
$.ajax({
url: "img_upload.php",
type: "POST",
data: formdata,
processData: false,
contentType: false
}).done(function (res) {
/* *** show uploaded item *** */
/* *** show response *** */
});
}
Мои знания в Javascript очень слабые, и я не могу узнать, как изменить этот код, чтобы он отправлял загруженный файл сам по себе, а не в массив.
Я попробовал это независимо, но ни один из них не работал (send_img - это имя формы / идентификатор):
formdata = document.send_img.uploaded_file.value;
formdata = document.getElementById("uploaded_file");
formdata = new formdata ($('#send_img'));
formData = $('#send_img').serialize();
formdata.replaceWith("uploaded_file[]", file);
Я также пытался устранить for
использовать тот же ключ (0), но он не работает таким образом. Сокращенный код для img_upload.php:
$fileName = $target . $_FILES["uploaded_file"]["name"];
$fileTmpLoc = $_FILES["uploaded_file"]["tmp_name"];
$fileName = $new_name . "." . $fileExt;
move_uploaded_file($fileTmpLoc, "images/images/temp/$fileName");
Как я могу отправить загруженный файл (или заголовок или что-то, что он должен отправить) в одну строку и, в случае добавления второго файла, заменить первый вместо создания второго значения в массиве?
2 ответа
Проблема не в вашей логике, проблема в том, что файлы не могут быть загружены через ajax.
Но, может быть, вы спросите, как другие? Ну, попробуйте плагин формы (другой.js, который работает с jQuery)
Я нашел это для вас, он работает с использованием метода submit, но, возможно, вы можете сделать submit при изменении ввода или найти другой вид решения с действиями javascript.
Проверьте это: http://www.miguelmanchego.com/2009/subir-archivos-usando-ajax-jquery/
Сайт на испанском, но если нужно, переведите его на английский. Также эта ссылка включает в себя живой пример и загрузку исходного кода.
С уважением.
Ниже приведены мои настройки AJAX, которые могут загружать файлы
method: "POST",
url: url,
headers: { 'Content-Type': undefined },
transformRequest: function (data, headersGetter) {
var formData = new FormData();
angular.forEach(data, function (value, key) {
if (Array.isArray(value)) {
// To save array of items
angular.forEach(value, function (value1, key1) {
if (value1.constructor.name != "File") {
angular.forEach(value1, function (value2, key2) {
formData.append(key + '[' + key1 + '].' + key2, value2);
});
}
});
} else {
formData.append(key, value);
}
});
return formData;
},
enctype: 'multipart/form-data',
dataType: 'json',
traditional: true,
data: data,
cache: false,
processData: false,
contentType: false