Конвертировать и объект в файл и отправить через Ajax

Выравнивание переменных в памяти (короткая история).

На прошлых компьютерах была 8-битная шина данных. Это означает, что каждый такт 8 бит информации может быть обработан. Тогда это было хорошо.

Затем появились 16-разрядные компьютеры. Из-за нисходящей совместимости и других проблем был сохранен 8-битный байт, и было введено 16-битное слово. Каждое слово было 2 байта. И каждый такт 16 бит информации может быть обработан. Но это создавало небольшую проблему.

Давайте посмотрим на карту памяти:

+----+
|0000| 
|0001|
+----+
|0002|
|0003|
+----+
|0004|
|0005|
+----+
| .. |

. На каждом адресе есть байт, к которому можно получить доступ индивидуально. Но слова могут быть получены только по четным адресам. Поэтому, если мы читаем слово в 0000, мы читаем байты в 0000 и 0001. Но если мы хотим прочитать слово в позиции 0001, нам нужны два обращения к чтению. Сначала 0000,0001, а затем 0002 0003, и мы сохраняем только 00010002.

Конечно, это заняло некоторое дополнительное время, и это не было оценено. Вот почему они изобрели выравнивание. Таким образом, мы сохраняем переменные слов в границах слов и байтовых переменных на границах байтов.

Например, если у нас есть структура с байтовым полем (B) и полем слов (W) (и очень наивный компилятор ), получаем следующее:

+----+
|0000| B
|0001| W
+----+
|0002| W
|0003|
+----+

Это не весело. Но при использовании выравнивания слов мы находим:

+----+
|0000| B
|0001| -
+----+
|0002| W
|0003| W
+----+

Здесь память приносится в жертву для скорости доступа.

Вы можете себе представить, что при использовании двойного слова (4 байта) или четырех слова (8 байтов) это еще более важно. Вот почему с большинством современных компиляторов вы можете выбрать, какое выравнивание вы используете при компиляции программы.

0
задан Jagruti 20 March 2019 в 05:55
поделиться

1 ответ

Будет ли typeof до и после преобразования одинаковым?

Поскольку «file» не является типом данных JavaScript. Все, что не является примитивным, является объектом.

console.log(typeof 1);
console.log(typeof "1");
console.log(typeof null);
console.log(typeof undefined);
console.log(typeof [1,2,3]);
console.log(typeof {hello: "world"});
console.log(typeof new Date());
console.log(typeof document.body);
console.log(typeof window);

2) Как я могу отправить массивы файловых объектов в бэкэнд? Есть ли другое решение?

  1. Понимать, как форматируются данные при отправке их по HTTP
  2. Понимать ограничения jQuery

Вы не можете отправить массив. Вы можете отправить только некоторый текст, который серверный код может собрать в массив.

Для обоих стандартных кодировок, поддерживаемых формами , PHP заполнит

Будет ли typeof до и после преобразования одинаковым?

Поскольку «file» не является типом данных JavaScript. Все, что не является примитивным, является объектом.

[110]

2) Как я могу отправить массивы файловых объектов в бэкэнд? Есть ли другое решение?

  1. Понимать, как форматируются данные при отправке их по HTTP
  2. Понимать ограничения jQuery

Вы не можете отправить массив. Вы можете отправить только некоторый текст, который серверный код может собрать в массив.

Для обоих стандартных кодировок, поддерживаемых формами , PHP заполнит [118] данными в них.

Если имя поля в этих данных заканчивается на [], PHP поместит массив в

Будет ли typeof до и после преобразования одинаковым?

Поскольку «file» не является типом данных JavaScript. Все, что не является примитивным, является объектом.

[110]

2) Как я могу отправить массивы файловых объектов в бэкэнд? Есть ли другое решение?

  1. Понимать, как форматируются данные при отправке их по HTTP
  2. Понимать ограничения jQuery

Вы не можете отправить массив. Вы можете отправить только некоторый текст, который серверный код может собрать в массив.

Для обоих стандартных кодировок, поддерживаемых формами , PHP заполнит [118] данными в них.

Если имя поля в этих данных заканчивается на [119], PHP поместит массив в [1110].

Если вы передадите массив в jQuery ajax:

data: { someValue: [1, 2, 3] }

Тогда jQuery закодирует его как:

someValue[]=1&someValue[]=2&someValue[]=3

… поэтому PHP сгенерирует массив.

Однако значения должны быть вещами, которые понимает jQuery. Он не может обрабатывать FormData объектов.

Если вы хотите отправить объект FormData (что необходимо сделать для отправки файлов), вам нужно отправить вместо объекта:

jQuery.ajax({
    url: "/foo",
    data: a_form_data_object,
    processData: false,
    contentType: false,
});
[1134 ] Вам нужно processData, чтобы он не пытался преобразовать объект FormData (то есть, чтобы он позволил XMLHttpRequest сделать это). Вам нужно contentType, чтобы остановить его, переопределяя один XMLHttpRequest, сгенерированный из объекта FormData.

Итак, чтобы отправить массив, мы возвращаемся к правилам, которые я описал выше. Вы сказали:

fileBag.append(file_name, file);

Но чтобы получить массив, вам нужно имя, заканчивающееся на [].

fileBag.append("myname[]", file);

Наконец, не виден в вашем вопросе, но смотрит на ваш кодовый блок. Это даст вам набор файлов:

document.getElementById(fileUploadButtonId).files;

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

Вы можете упростить свой код:

var fileBag = new FormData(); 
var files = document.getElementById(fileUploadButtonId).files;
var arrayOfAllUploadedFiles = Array.from(files);
fileArray.forEach(file => fileBag.append("myname[]", file);
jQuery.ajax({
    url: "/foo",
    data: fileBag,
    processData: false,
    contentType: false,
});
POST
.

Если вы передадите массив в jQuery ajax:

[111]

Тогда jQuery закодирует его как:

[112]

… поэтому PHP сгенерирует массив.

Однако значения должны быть вещами, которые понимает jQuery. Он не может обрабатывать FormData объектов.

Если вы хотите отправить объект FormData (что необходимо сделать для отправки файлов), вам нужно отправить вместо объекта:

[113] [1134 ] Вам нужно processData, чтобы он не пытался преобразовать объект FormData (то есть, чтобы он позволил XMLHttpRequest сделать это). Вам нужно contentType, чтобы остановить его, переопределяя один XMLHttpRequest, сгенерированный из объекта FormData.

Итак, чтобы отправить массив, мы возвращаемся к правилам, которые я описал выше. Вы сказали:

[114]

Но чтобы получить массив, вам нужно имя, заканчивающееся на [].

[115]

Наконец, не виден в вашем вопросе, но смотрит на ваш кодовый блок. Это даст вам набор файлов:

[116]

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

Вы можете упростить свой код:

[117]POST
данными в них.

Если имя поля в этих данных заканчивается на [], PHP поместит массив в

Будет ли typeof до и после преобразования одинаковым?

Поскольку «file» не является типом данных JavaScript. Все, что не является примитивным, является объектом.

[110]

2) Как я могу отправить массивы файловых объектов в бэкэнд? Есть ли другое решение?

  1. Понимать, как форматируются данные при отправке их по HTTP
  2. Понимать ограничения jQuery

Вы не можете отправить массив. Вы можете отправить только некоторый текст, который серверный код может собрать в массив.

Для обоих стандартных кодировок, поддерживаемых формами , PHP заполнит [118] данными в них.

Если имя поля в этих данных заканчивается на [119], PHP поместит массив в [1110].

Если вы передадите массив в jQuery ajax:

[111]

Тогда jQuery закодирует его как:

[112]

… поэтому PHP сгенерирует массив.

Однако значения должны быть вещами, которые понимает jQuery. Он не может обрабатывать FormData объектов.

Если вы хотите отправить объект FormData (что необходимо сделать для отправки файлов), вам нужно отправить вместо объекта:

[113] [1134 ] Вам нужно processData, чтобы он не пытался преобразовать объект FormData (то есть, чтобы он позволил XMLHttpRequest сделать это). Вам нужно contentType, чтобы остановить его, переопределяя один XMLHttpRequest, сгенерированный из объекта FormData.

Итак, чтобы отправить массив, мы возвращаемся к правилам, которые я описал выше. Вы сказали:

[114]

Но чтобы получить массив, вам нужно имя, заканчивающееся на [].

[115]

Наконец, не виден в вашем вопросе, но смотрит на ваш кодовый блок. Это даст вам набор файлов:

[116]

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

Вы можете упростить свой код:

[117]POST
.

Если вы передадите массив в jQuery ajax:

[111]

Тогда jQuery закодирует его как:

[112]

… поэтому PHP сгенерирует массив.

Однако значения должны быть вещами, которые понимает jQuery. Он не может обрабатывать FormData объектов.

Если вы хотите отправить объект FormData (что необходимо сделать для отправки файлов), вам нужно отправить вместо объекта:

[113] [1134 ] Вам нужно processData, чтобы он не пытался преобразовать объект FormData (то есть, чтобы он позволил XMLHttpRequest сделать это). Вам нужно contentType, чтобы остановить его, переопределяя один XMLHttpRequest, сгенерированный из объекта FormData.

Итак, чтобы отправить массив, мы возвращаемся к правилам, которые я описал выше. Вы сказали:

[114]

Но чтобы получить массив, вам нужно имя, заканчивающееся на [].

[115]

Наконец, не виден в вашем вопросе, но смотрит на ваш кодовый блок. Это даст вам набор файлов:

[116]

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

Вы можете упростить свой код:

[117]
0
ответ дан Quentin 20 March 2019 в 05:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: