Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   formData не работает multiple values (https://javascript.ru/forum/misc/76389-formdata-ne-rabotaet-multiple-values.html)

Ким чен ин 07.01.2019 23:36

formData не работает multiple values
 
Подскажите, никак не пойму почему не работает multiple values
const formData = new FormData();
                this.files.forEach(file => {
                    formData.append('images[]', file, file.name);
                });
                console.log(formData.getAll('images'))

показывает пустой массив
если убрать квадратные скобки
formData.append('images', file, file.name);

то работает, естественно один элемент загружается

laimas 08.01.2019 02:21

https://developer.mozilla.org/ru/doc...ormData/append

Ким чен ин 08.01.2019 02:56

я вроде так и делаю
Цитата:

Также вы можете использовать обозначения массива для первого аргумента:

formData.append('userpic[]', myFileInput1.files[0], 'chris1.jpg');
formData.append('userpic[]', myFileInput2.files[0], 'chris2.jpg');

Эта техника позволяет упростить мультифайловую загрузку данных потому, что в результате структура данных является более благоприятной для цикла.

laimas 08.01.2019 03:03

Просто уберите третий параметр.

Ким чен ин 08.01.2019 03:18

Вложений: 1
бесполезно

laimas 08.01.2019 03:48

Что ошибок не показывает? Будет работать, заменить forEach на for или for ... of. Да и какая надобность именно в apend, почему не просто отдать форму FormData() или нет ее?

Ким чен ин 08.01.2019 10:24

Вложений: 1
В том то и дело, никаких ошибок, все чисто. Формы нету, просто инпут. Поменял на for
for(let file of this.files){
                    console.log(file)
                    formData.append('images[]',file);
                }
                console.log(formData.getAll('images'))

на входе есть, на выходе шиш

laimas 08.01.2019 10:29

На сервере РНР (если судить по ключу передаваемому, то да)?

Ким чен ин 08.01.2019 10:36

Да, back - php front - vue

laimas 08.01.2019 10:51

Тогда сохранить под любым именем и запустить:

<?
    if($_FILES) exit(print_r($_FILES, 1))
?>
<!DOCTYPE HTML>
<html>
<head>
	<meta http-equiv="content-type" content="text/html" />
<script type="text/javascript">
function send(f) {
    var xhr = new XMLHttpRequest(),
        data = new FormData();
        
    for(var i of f.files) data.append('images[]', i); //проблемы с поддержкой
        
    xhr.open('POST', location);
        
    xhr.onload = function() {
        if (xhr.status == 200) {
            alert(xhr.responseText)
        }    
    }
    
    xhr.send(data); 
}
</script>
</head>
<body>
<input type="file" onchange="send(this)" multiple="" />
</body>
</html>


Возвращает сервер информацию о загруженном? Следовательно у вас есть нечто с чем нужно разбираться.

Ким чен ин 08.01.2019 11:16

работает, вот я и пытаюсь разобраться
Цитата:

Array
(
[images] => Array
(
[name] => Array
(
[0] => fdd.png
)

[type] => Array
(
[0] => image/png
)

[tmp_name] => Array
(
[0] => /tmp/phpMszSXQ
)

[error] => Array
(
[0] => 0
)

[size] => Array
(
[0] => 31689
)

)

)

laimas 08.01.2019 11:36

Сеть у себя проверяйте - запрос с клиента есть, сервер отвечает? А если отвечает, то какие заголовки он принимает, может ваш Ajax банально отправляет application/x-www-form-urlencoded?

Ким чен ин 08.01.2019 11:46

так console.log где я ответ смотрю до ajax, до сервера на этот момент даже не доходит еще.
Да и сервер ответ отдает нормально, если квадратные скобки убрать ответ есть и в консоле, и от срвера
Я вот думаю, vue крутится на vue cli (Standard Tooling for Vue.js Development )
может он чета мутит...
С другой стороны этоже броузер код выполняет, на тот момент vue cli уже касательства не имеет

Ким чен ин 08.01.2019 12:11

Вложений: 1
если скобки убираю, работает
formData.append('images',file);

laimas 08.01.2019 12:11

Цитата:

Сообщение от Ким чен ин
Да и сервер ответ отдает нормально

Это как понимать?

laimas 08.01.2019 12:12

Цитата:

Сообщение от Ким чен ин
если скобки убираю

Какие, откуда?

Ким чен ин 08.01.2019 12:15

напал на след, добавил в ваш код console.log и тоже фиг
function send(f) {
            var xhr = new XMLHttpRequest(),
                data = new FormData();

            for(var i of f.files) data.append('images[]', i); //проблемы с поддержкой
            console.log(data.getAll('images'))
            xhr.open('POST', location);

            xhr.onload = function() {
                if (xhr.status == 200) {
                    alert(xhr.responseText)
                }
            }

            xhr.send(data);
        }

Ким чен ин 08.01.2019 12:20

пардон, ответ от сервера хоть и 200 но пустой
скобки отсюда data.append('images[] <- эти

laimas 08.01.2019 12:30

То есть этот код вставлен на страницу, в которой проблемы?

Ким чен ин 08.01.2019 12:39

Вложений: 1
нет, этот код в пустой странице, если открыть файл выскакивает
print_r($_FILES, 1), все показывает
но при этом в консоле пустой массив, как и у меня
for(var i of f.files) data.append('images[]', i); //проблемы с поддержкой
console.log(data.getAll('images'))
это значит что может оно и работает, но я этого просто не вижу, консоль не показывает, и ответ сервера пустой
буду думать

laimas 08.01.2019 12:52

Вот работа файла - https://screenshots.firefox.com/RlbL4Np74EwTS1bC/null Как видно выбрано два и сервер отдает информацию о двух принятых. А коли у вас только один из всех или вообще не принимает, то смотрите настройки своего сервера - ограничения на объем POST данных и одного файла.

laimas 08.01.2019 13:08

Цитата:

Сообщение от Ким чен ин
но при этом в консоле пустой массив, как и у меня

Если бы не заметил другой, я так бы все и думал о возврате сервером пустого ответа, а вы консоли выглядываете. Лучше бы в Сеть посмотрели, что отправляет сервер.

Ким чен ин 08.01.2019 17:33

Цитата:

Сообщение от Rise (Сообщение 501550)
Ким чен ин,
А почему у вас images в .append('images[]', ...) со скобками, а в .getAll('images') без скобок? Это не одно и тоже имя как бы, естественно пустой массив будет, в js эти скобки это часть имени.

вот черт, весь лоб расшиб об эти скобки:-E
спасибо, теперь вижу в консоле, пошел дальше искать, печему сервер пустой массив видит, но это уже легче.

laimas 08.01.2019 18:02

Цитата:

Сообщение от Ким чен ин
печему сервер пустой массив видит

Как пустой, а это откуда https://javascript.ru/forum/misc/763...tml#post501539 ?

Ким чен ин 08.01.2019 19:09

Это отсюда
а а сервер не видел потому что сделал копипаст запроса, а поменять get на post забыл.
Теперь все работает. Когда однозначно стало ясно что проблема на стороне сервера найти причину уже не составило труда


Часовой пояс GMT +3, время: 02:54.