iOS Safari 13.3.1 размер загружаемого файла равен 0 - PullRequest
0 голосов
/ 17 марта 2020

У меня есть простой страничный сайт на PHP, где пользователи могут загружать файлы (stl-модель). Сначала я использовал для загрузки JS FormData. Это работает в Chrome и Firefox, но Safari iOS иногда отправляет файл с размером = 0 байт. JS console.log показывает, что размер файла 718120 байт перед отправкой. PHP режим отладки показывает, что глобальный $ _FILE существует и имя файла истинно, но файл пуст:

(
    [name] => TRRSExtenderMount.stl
    [type] => application / octet-stream
    [tmp_name] => / tmp / phphDceFc
    [error] => 0
    [size] => 0
)

Время от времени повторяется ошибка с размером 0.

Что Я пробовал:

  • проверено phpinfo post_max_size, upload_max_filesize
  • протестировано на разных устройствах (все с 13.3.1 iOS)
  • протестировано с разными stl-файлами и размер файла (от 0,5 МБ до 16 МБ)
  • протестировано с 3g, 4g и Wi-Fi
  • проверено медленная скорость загрузки: проверьте размер файла, подождите 10 секунд и проверьте снова
  • изменена форма ввода для стандартного HTML с методом POST без JS

Но ошибка повторилась снова. Что я делаю не так?

1 Ответ

0 голосов
/ 21 апреля 2020

Итак, я исправил эту проблему. Может быть, мой опыт может кому-то помочь:

  1. Я воспроизвел эту ошибку, когда вы повторяете Ajax вызов через 2 минуты после первого вызова, если вы не перезагрузите страницу.
  2. I заметил, что атрибут объекта файла "lastModified" всегда равен дате создания файла. Так что браузер может использовать Formdata из кеша. Я добавил следующий код, чтобы всегда отправлять «новый» файл:
    this.trueFile = new File([this.originalFile], 'file-name.stl', {lastModified: new Date()});
После этого ошибка изменилась: второй Ajax вызов (через 2 мин) потерпел аварию по таймауту и ​​вернул следующее сообщение:
    TypeError: 'caller', 'callee', and 'arguments' properties may not be accessed on strict mode
Следующий шаг Я нашел этот вопрос: Получение TypeError: свойства 'caller', 'callee' и 'arguments' не могут быть доступны в строгом режиме , И удалить следующую строку: dataType: 'json' из моего код. И это помогло.
...