Chrome 83: Невозможно загрузить файл - PullRequest
11 голосов
/ 25 мая 2020

Я обновил Chrome до версии 83, и некоторые из моих форм, в которых используется компонент «Ajax выгрузка» (подробнее см. Ниже), не работают. Я прочитал проблемы новой версии (https://developers.google.com/web/updates/2020/05/nic83), но не могу найти ничего, связанного с формами, фреймами, файлами, ajax или сообщениями.

Я попробую выложить образец на fiddler, но хочу знать, знает ли кто-нибудь что-нибудь об этом.

Кстати, в других формах у меня есть многофайловый загрузчик с функцией перетаскивания (dropzone. js), и он работает нормально, но его непросто преобразовать, и мне нужно быстрое решение.

фиктивный образец (у меня нет песочницы для тестирования загрузки): https://jsfiddle.net/drvespa/7ue8k94r/3/

  • на Chrome 83 (пробовал на Canary 85): ошибка не возникает, потому что отправка формы не улавливается компонентом AjaxUpload. Обратный вызов вызывается до завершения отправки, и ответ пуст.
  • На Firefox: выдает ошибку, потому что компонент AjaxUpload пытается десериализовать 404 фиктивной страницы загрузки.

Размещаю библиотеку на https://filebin.net/8sgsmq7sh14m0qen:

/**
* Ajax upload
* Project page - http://valums.com/ajax-upload/
* Copyright (c) 2008 Andris Valums, http://valums.com
* Licensed under the MIT license (http://valums.com/mit-license/)
* Version 3.6 (26.06.2009)
*/

Ответы [ 5 ]

12 голосов
/ 26 мая 2020

Проблема в том, что библиотека создает

/**
* Creates iframe with unique name
*/
_createIframe: function () {
    // unique name
    // We cannot use getTime, because it sometimes return
    // same value in safari :(
    var id = getUID();

    // Remove ie6 "This page contains both secure and nonsecure items" prompt 

    var iframe = toElement('<iframe src="javascript:false;" name="' + id + '" />');
    iframe.id = id;
    iframe.style.display = 'none';
    d.body.appendChild(iframe);
    return iframe;
},

затем в submit метод

            var iframe = this._createIframe();

            // some synchronous operations

            addEvent(iframe, 'load', function (e) { // ...

Поскольку этот iframe имеет атрибут src, Chrome начнет загрузку, а поскольку его src является поддельным URL-адресом, эта операция фактически выполняется синхронно, то есть что событие загрузки уже настроено на запуск на следующей итерации event-l oop.

const frame = document.createElement('iframe');
frame.src = 'javascript:return false';
document.body.append(frame);
frame.addEventListener('load', (evt) => console.log('loaded', frame.src) );

setTimeout( () => frame.src = "about:blank", 0 );

// Results in Chrome:
// loaded javascript:return false
// loaded about:blank

// Results in Firefox:
// loaded about:blank

Таким образом, единственное событие load, которое получает эта библиотека, - это событие начальной загрузки пустого документа, а не событие реального запроса.

Чтобы исправить это, все, что вам нужно, это удалить этот src="javascript:false;" из кода библиотеки: https://jsfiddle.net/9phxmqjw/

3 голосов
/ 26 мая 2020

Я просто установил атрибут srcdo c на iframe равно url в AjaxUpload компоненте.

iframe .setAttribute ('srcdo c', this._settings.action);

Моя проблема решена.

Функция в файле AjaxUpload. js:

        _createIframe: function(){
            var id = getUID();            

            var iframe = toElement('<iframe src="javascript:false;" name="' + id + '" />');        
            iframe.setAttribute('id', id);
            iframe.setAttribute('srcdoc', this._settings.action);

            iframe.style.display = 'none';
            document.body.appendChild(iframe);

            return iframe;
        }
1 голос
/ 26 мая 2020

Этот ответ помог мне исправить нашу копию Atmail, поэтому загрузка вложений снова работает в Chrome 83 - спасибо!

Вышеупомянутую строку setAttribute следует вставить в файл AjaxUpload. js внутри ' _createIframe '. Я поместил его сразу под вызовом setAttribute ('id', id), и это помогло:)

0 голосов
/ 29 мая 2020

Спасибо! Кроме того, для всех, кто все еще использует Opencart 1.5 после этого Chrome обновления, загрузка изображений и документов исправлена ​​путем добавления:

iframe.setAttribute('srcdoc', this._settings.action);

в \ admin \ view \ javascript \ jquery \ ajaxupload. js

var iframe = toElement('<iframe src="javascript:false;" name="' + id + '" />');
            // src="javascript:false; was added
            // because it possibly removes ie6 prompt 
            // "This page contains both secure and nonsecure items"
            // Anyway, it doesn't do any harm.
            iframe.setAttribute('id', id);
            iframe.setAttribute('srcdoc', this._settings.action);
            iframe.style.display = 'none';
            document.body.appendChild(iframe);
0 голосов
/ 29 мая 2020

Мы использовали этот старый плагин:

http://jquery.malsup.com/form/#options -object

Там есть опция, которую вы могли бы использовать, если бы вы поддерживали ie8 в какой-то момент за последние 10 лет ...

{
    url: '/branded/image_upload',
    type: 'POST',
    iframe: false
}

У нас также было <textarea></textarea> взлом оболочки в ответе.

Этот код был передан через множество итераций lol.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...