Ввод файла очищается при попытке отправки на IE8 - PullRequest
1 голос
/ 15 июля 2011

Я работаю с AJAX-загрузками.Поскольку IE не имеет требуемого объекта, мне придется обойти iframes.

Теоретически все довольно просто:

  1. Создание формы и iframe
  2. Изменение цели формы и атрибута имени iframe
  3. При изменении поля входного файла форма будет отправлена ​​

Кроме того, поскольку поле входного файла отстой, онобыло бы неплохо иметь кнопку «Загрузить», которая запускает событие click скрытого поля входного файла, чтобы открыть диалоговое окно выбора файла.

Да, это была теория.На самом деле все намного хуже.Во-первых, IE8 почему-то не нравится клонированные iframes, поэтому мы должны добавлять каждый из них на ходу.Затем поле ввода файла очищается при попытке отправки.

Я выяснил, что происходит и когда, и это довольно уродливо.

Отправляйтесь на этот пример и этоработает довольно хорошо.Форма клонируется, поле файла содержит данные, и форма отправляется.Однако входной файл не имеет атрибута name, и я не могу получить к нему доступ на стороне сервера.
Поэтому я добавил атрибут , вот пример , и вот что происходит: поле fileочищено.Просто потому, что атрибут name.

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

Спасибо.

Ответы [ 3 ]

2 голосов
/ 19 октября 2011

Вы должны щелкнуть входной файл в IE (возможно, для безопасности), а не нажимать другую кнопку, чтобы вызвать событие щелчка.

<script>
    $(function() {
        var uploadFile = $('#uploadFile');
        var txtUploadFile = $('#txtUploadFile');
        var btnUploadFile = $('#btnUploadFile');

        uploadFile.css('position', 'absolute')
                .css('opacity', '0')
                .width(30);

        uploadFile.change(function() {
            txtUploadFile.val(this.value);
        });

        btnUploadFile.mousemove(function(e) {
            uploadFile.css('top', btnUploadFile.offset().top)
                .css('left', e.pageX - uploadFile.width() / 2);
        });
    });

<body>
    <form target="hiddenIframe" action="your_upload_site" method="post" enctype="multipart/form-data">
        <input id="txtUploadFile"> 
        <input id="btnUploadFile" type="button" value="Select">
        <input id="uploadFile" name="uploadFile" type="file" />
        <input type="submit" value="Upload">
    </form>

    <iframe name="hiddenIframe" style="display: none;"></iframe>

0 голосов
/ 06 января 2015

немного поздно, но у меня была та же проблема сегодня, и я мог ее решить. Используйте метку с атрибутом for, указывающую на ввод файла.

Ваш HTML будет выглядеть так:

<label for=foo>Upload<label>
<form>
    <input type=file id=foo>
    <input type=submit>
</form>

При клике на событии метки вы создаете только iframe. Затем у вас есть onchange-Listener для ввода файла, который запускает отправку формы. Мой вариант использования был немного другим, поэтому я не уверен на 100%, работает ли он и у вас, но я думаю, что так и должно быть.

0 голосов
/ 15 июля 2011

Атрибут имени для input[type=file] доступен только для чтения.Согласно http://msdn.microsoft.com/en-us/library/ms535128(v=vs.85).aspx:

Windows Internet Explorer 8 и более поздних версий.Когда файл выбирается с использованием объекта input type = file, значение свойства value зависит от значения параметра безопасности «Включить путь к локальному каталогу при загрузке файлов на сервер» для зоны безопасности, используемой для отображения веб-страницы.содержащий входной объект.

Полное имя файла выбранного файла возвращается, только если этот параметр включен.Когда этот параметр отключен, Internet Explorer 8 заменяет локальный диск и путь к каталогу строкой C: \ fakepath \, чтобы предотвратить несоответствующее раскрытие информации.

Для иллюстрации предположим, вы пытаетесь загрузить файл с именем C: \ пользователи \ Contoso \ документы \ file.txt.Когда вы делаете это, значение свойства value устанавливается в c: \ fakepath \ file.txt.

EDIT: Я не могу точно сказать, является ли этопроблема или нет, поскольку ваш вопрос немного расплывчат в отношении того, чего вы пытаетесь достичь.

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