Почему при загрузке файла эта ошибка показывает неопределенный индекс? [Дубликат]

Оператор == всегда предназначен для сравнения ссылок на объекты, тогда как метод сравнения строк .equals () переопределяется для сравнения содержимого:

String s1 = new String("abc");
String s2 = new String("abc");
System.out.println(s1 == s2); // It prints false (reference comparison)
System.out.println(s1.equals(s2)); // It prints true (content comparison)
2628
задан Kevin B 31 October 2017 в 17:37
поделиться

28 ответов

Использование HTML5 и JavaScript, загрузка async довольно проста, я создаю логику загрузки вместе с вашим html, это не полностью работает, так как ему нужно api, но демонстрируйте, как это работает, если у вас есть конечная точка с именем /upload от root вашего сайта, этот код должен работать для вас:

const asyncFileUpload = () => {
  const fileInput = document.getElementById("file");
  const file = fileInput.files[0];
  const uri = "/upload";
  const xhr = new XMLHttpRequest();
  xhr.upload.onprogress = e => {
    const percentage = e.loaded / e.total;
    console.log(percentage);
  };
  xhr.onreadystatechange = e => {
    if (xhr.readyState === 4 && xhr.status === 200) {
      console.log("file uploaded");
    }
  };
  xhr.open("POST", uri, true);
  xhr.setRequestHeader("X-FileName", file.name);
  xhr.send(file);
}
<form>
  <span>File</span>
  <input type="file" id="file" name="file" size="10" />
  <input onclick="asyncFileUpload()" id="upload" type="button" value="Upload" />
</form>

Также имеется дополнительная информация о XMLHttpReques:

Объект XMLHttpRequest

Все современные браузеры поддерживают объект XMLHttpRequest. Объект XMLHttpRequest может использоваться для обмена данными с веб-сервером за кулисами. Это означает, что можно обновлять части веб-страницы без перезагрузки всей страницы.

Создать объект XMLHttpRequest

Все современные браузеры (Chrome, Firefox, IE7 +, Edge, Safari, Opera) имеют встроенный объект XMLHttpRequest.

Синтаксис для создания объекта XMLHttpRequest:

variable = new XMLHttpRequest ();

Доступ во всех доменах

Из соображений безопасности современные браузеры не разрешают доступ через домены.

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

В примерах в W3Schools все файлы XML, расположенные в домене W3Schools.

Если вы хотите использовать пример выше на одной из ваших собственных веб-страниц, загружаемые файлы XML должны находиться на вашем собственном сервере.

Подробнее , вы можете продолжить чтение здесь ...

3
ответ дан Alireza 15 August 2018 в 20:51
поделиться

Вы можете использовать

$(function() {
    $("#file_upload_1").uploadify({
        height        : 30,
        swf           : '/uploadify/uploadify.swf',
        uploader      : '/uploadify/uploadify.php',
        width         : 120
    });
});

Демо

7
ответ дан Amit 15 August 2018 в 20:51
поделиться

С помощью HTML5 вы можете выполнять загрузку файлов с помощью Ajax и jQuery. Кроме того, вы можете выполнять проверки файлов (имя, размер и тип MIME) или обрабатывать событие прогресса с тегом прогресса HTML5 (или div). Недавно мне пришлось сделать загрузчик файлов, но я не хотел использовать Flash , а также iframes или плагины, и после некоторых исследований я придумал решение.

HTML:

<form enctype="multipart/form-data">
    <input name="file" type="file" />
    <input type="button" value="Upload" />
</form>
<progress></progress>

Во-первых, вы можете сделать некоторую проверку, если хотите. Например, в событии onChange файла:

$(':file').on('change', function() {
    var file = this.files[0];
    if (file.size > 1024) {
        alert('max upload size is 1k')
    }

    // Also see .name, .type
});

Теперь Ajax submit с нажатием кнопки:

$(':button').on('click', function() {
    $.ajax({
        // Your server script to process the upload
        url: 'upload.php',
        type: 'POST',

        // Form data
        data: new FormData($('form')[0]),

        // Tell jQuery not to process data or worry about content-type
        // You *must* include these options!
        cache: false,
        contentType: false,
        processData: false,

        // Custom XMLHttpRequest
        xhr: function() {
            var myXhr = $.ajaxSettings.xhr();
            if (myXhr.upload) {
                // For handling the progress of the upload
                myXhr.upload.addEventListener('progress', function(e) {
                    if (e.lengthComputable) {
                        $('progress').attr({
                            value: e.loaded,
                            max: e.total,
                        });
                    }
                } , false);
            }
            return myXhr;
        }
    });
});

Как вы можете видеть, с HTML5 (и некоторыми исследование) загрузка файлов не только становится возможной, но и супер легко. Попробуйте Google Chrome , так как некоторые из компонентов HTML5 примеров недоступны в каждом браузере.

2340
ответ дан Ayush Gupta 15 August 2018 в 20:51
поделиться
  • 1
    Могу ли я использовать $ _FILES в файле upload.php? – Alessandro Cosentino 2 November 2012 в 15:41
  • 2
    Это должно работать в Internet Explorer, но только в версии 10. ( caniuse.com/xhr2 ) – Samir 2 January 2013 в 18:33
  • 3
    Не работает в IE7-9 – KevinDeus 6 May 2013 в 22:39
  • 4
    Привет, я ценю, что PHP - это ваш язык выбора ... но мне интересно, знаете ли вы, что это также работает в ASP.NET MVC? Я разработчик .NET, и я попытался использовать ваш простой пример для загрузки файла AJAX, но на стороне сервера я не получаю файл, который я отправил через AJAX. Я использую новейший Chrome. – Shumii 1 June 2013 в 06:29
  • 5
    Это FormData , который делает всю магию здесь. Обязательно проверьте эти документы - он охватывает весь ваш вопрос о нескольких файлах и полях. – incarnate 12 September 2013 в 14:26

Вы можете использовать JavaScript Fetch API . Например:

function uploadButtonCLicked(){
    var input = document.querySelector('input[type="file"]')

    fetch('/url', {
      method: 'POST',
      body: input.files[0]
    }).then(res => res.json())   // you can do something with response
      .catch(error => console.error('Error:', error))
      .then(response => console.log('Success:', response));
}                               

Преимущество: API Fetch поддерживается всеми современными браузерами, поэтому вам не нужно ничего импортировать. Также обратите внимание, что fetch () возвращает Promise , который затем обрабатывается с помощью .then(..code to handle response..) асинхронно.

2
ответ дан BlackBeard 15 August 2018 в 20:51
поделиться

Обход для будущих читателей.

Асинхронная загрузка файла

С помощью HTML5

Вы можете загружать файлы с помощью jQuery с помощью метода $.ajax(), если Поддерживаются форматыDataData и API файлов (обе функции HTML5).

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

$.ajax({
  url: 'file/destination.html', 
  type: 'POST',
  data: new FormData($('#formWithFiles')[0]), // The form with the file inputs.
  processData: false,
  contentType: false                    // Using FormData, no need to process data.
}).done(function(){
  console.log("Success: Files sent!");
}).fail(function(){
  console.log("An error occurred, the files couldn't be sent!");
});

Для быстрого, чистого примера JavaScript (без jQuery) см. « Отправка файлов с использованием объекта FormData ».

Fallback

Когда HTML5 не поддерживается (нет File API ), единственное другое чистое решение для JavaScript (нет Flash или любого другого плагина браузера) - это скрытая техника iframe, которая позволяет эмулировать асинхронный запрос без использования объекта XMLHttpRequest .

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

Если все сделано правильно, оно должно работать практически в любом браузере, но в нем есть некоторые предостережения о том, как получить ответ от iframe.

В этом случае вы можете предпочесть использовать плагин-оболочку, такой как Bifröst , который использует технику iframe , но также предоставляет jQuery Ajax transport , позволяющий отправлять файлы только с помощью метода $.ajax() следующим образом:

$.ajax({
  url: 'file/destination.html', 
  type: 'POST',
  // Set the transport to use (iframe means to use Bifröst)
  // and the expected data type (json in this case).
  dataType: 'iframe json',                                
  fileInputs: $('input[type="file"]'),  // The file inputs containing the files to send.
  data: { msg: 'Some extra data you might need.'}
}).done(function(){
  console.log("Success: Files sent!");
}).fail(function(){
  console.log("An error occurred, the files couldn't be sent!");
});

Плагины

Bifröst - это всего лишь небольшая обертка, которая добавляет резервная поддержка метода ajax jQuery, но многие из вышеупомянутых плагинов, таких как jQuery Form Plugin или jQuery File Upload , включают весь стек из HTML5 в различные резервные копии и некоторые полезные функции для облегчения из процесса. В зависимости от ваших потребностей и требований вы можете захотеть рассмотреть голые версии или любой из этих плагинов.

75
ответ дан Danimal Reks 15 August 2018 в 20:51
поделиться
  • 1
    Одно замечание, основанное на документации: вы также должны отправить contentType: false. Когда я не отправил это с хром, тип содержимого формы был аннулирован jQuery. – ash 18 August 2015 в 22:44
  • 2
    Хороший ответ. Несколько советов по улучшению: Удалите части кода, не связанные с ответом, например обратные вызовы .done() и .fail(). Кроме того, пример без использования FormData и списка pro / cons был бы потрясающим. – Zero3 19 December 2015 в 19:10
  • 3
    Я получил эту ошибку: TypeError: Argument 1 of FormData.constructor does not implement interface HTMLFormElement. – candlejack 26 December 2016 в 00:15

Я нашел решение, чтобы цель <form> скрывала iFrame. Затем iFrame может запустить JS, чтобы показать пользователю, что он завершен (при загрузке страницы).

31
ответ дан Darryl Hein 15 August 2018 в 20:51
поделиться

Это мое решение.

<form enctype="multipart/form-data">    

    <div class="form-group">
        <label class="control-label col-md-2" for="apta_Description">Description</label>
        <div class="col-md-10">
            <input class="form-control text-box single-line" id="apta_Description" name="apta_Description" type="text" value="">
        </div>
    </div>

    <input name="file" type="file" />
    <input type="button" value="Upload" />
</form>

и js

<script>

    $(':button').click(function () {
        var formData = new FormData($('form')[0]);
        $.ajax({
            url: '@Url.Action("Save", "Home")',  
            type: 'POST',                
            success: completeHandler,
            data: formData,
            cache: false,
            contentType: false,
            processData: false
        });
    });    

    function completeHandler() {
        alert(":)");
    }    
</script>

Контроллер

[HttpPost]
public ActionResult Save(string apta_Description, HttpPostedFileBase file)
{
    return Json(":)");
}
4
ответ дан Erick Langford Xenes 15 August 2018 в 20:51
поделиться
  • 1
    Кажется, вы вложили в свой ответ какую-то структуру. Вы должны, по крайней мере, упомянуть, в какой структуре ваш ответ можно использовать. Еще лучше, удалите все фреймворк и представите только ответ на поставленный вопрос. – Zero3 19 December 2015 в 19:06
  • 2
    поэтому на самом деле существует структура mvc под названием «mvc»? и он использует синтаксис csharpish? это жестоко. – nonchip 6 January 2016 в 23:27

Существуют различные готовые плагины для выполнения загрузки файла для jQuery.

Выполнение такого рода загрузочных хаков - это не приятный опыт, поэтому людям нравится использовать готовые решения.

Вот несколько:

Вы можете искать другие проекты на NPM (используя " jquery-plugin "в качестве ключевого слова) или на Github.

335
ответ дан Esteban Herrera 15 August 2018 в 20:51
поделиться
  • 1
    AjaxFUP-ссылка, похоже, сломана. Я подозреваю, что это то, что называется: valums.com/ajax-upload – UlfR 16 July 2009 в 07:31
  • 2
    Для еще одного плагина, готового к чтению, всегда есть Filepicker.io , что очень приятно в том, что оно касается всех неприятных проблем с большой поддержкой файлов и т. Д. – brettcvz 22 June 2012 в 00:19
  • 3
    На самом деле это всего лишь около 10 линий ванили JS. Это действительно не так уж плохо. – mpen 17 February 2013 в 11:30
  • 4
    Готовые плагины решений могут работать отлично, но это не помогает через некоторое время, когда вы узнаете, что это не работает, как вы думали, и вам пришлось взломать его с незнакомыми сценариями. Таким образом, это происходит в обоих направлениях. – fletchsod 2 September 2014 в 14:54
  • 5
    Могу ли я использовать JQuery File Uploader для нескольких видеороликов ..? будет ли это поддерживать ..? – Mr world wide 13 February 2017 в 12:45
var formData=new FormData();
formData.append("fieldname","value");
formData.append("image",$('[name="filename"]')[0].files[0]);

$.ajax({
    url:"page.php",
    data:formData,
    type: 'POST',
    dataType:"JSON",
    cache: false,
    contentType: false,
    processData: false,
    success:function(data){ }
});

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

14
ответ дан falsarella 15 August 2018 в 20:51
поделиться
  • 1
    Примечание: cache: false является избыточным по запросу POST в качестве кешей POST никогда . – Gone Coding 10 August 2015 в 09:10
  • 2
    @Vivek Aasaithambi, я получил эту ошибку: TypeError: Argument 1 of FormData.constructor does not implement interface HTMLFormElement. – candlejack 26 December 2016 в 00:28

Я столкнулся с несколькими действительно мощными jQuery-файлами для загрузки файлов. Проверьте их:

  1. Plupload docs: http://www.plupload.com/docs
  2. Загрузка файла jQuery docs: https://github.com/blueimp/jQuery-File-Upload
  3. FineUploader docs: http://docs.fineuploader.com/
55
ответ дан Hristo 15 August 2018 в 20:51
поделиться

jQuery Uploadify - еще один хороший плагин, который я раньше использовал для загрузки файлов. Код JavaScript прост, как показано ниже: code. Тем не менее, новая версия не работает в Internet & nbsp; Explorer.

$('#file_upload').uploadify({
    'swf': '/public/js/uploadify.swf',
    'uploader': '/Upload.ashx?formGuid=' + $('#formGuid').val(),
    'cancelImg': '/public/images/uploadify-cancel.png',
    'multi': true,
    'onQueueComplete': function (queueData) {
        // ...
    },
    'onUploadStart': function (file) {
        // ...
    }
});

Я много искал, и я пришел к другому решению для загрузки файлов без какого-либо плагина и только с ajax. Решение таково:

$(document).ready(function () {
    $('#btn_Upload').live('click', AjaxFileUpload);
});

function AjaxFileUpload() {
    var fileInput = document.getElementById("#Uploader");
    var file = fileInput.files[0];
    var fd = new FormData();
    fd.append("files", file);
    var xhr = new XMLHttpRequest();
    xhr.open("POST", 'Uploader.ashx');
    xhr.onreadystatechange = function () {
        if (xhr.readyState == 4) {
             alert('success');
        }
        else if (uploadResult == 'success')
            alert('error');
    };
    xhr.send(fd);
}
21
ответ дан ivan_pozdeev 15 August 2018 в 20:51
поделиться
  • 1
    Uploadify был мертв годами. Больше не поддерживается и не поддерживается. – Ray Nicholus 8 June 2016 в 17:44

Этот AJAX-файл загружает плагин jQuery загружает файл somehwere и передает ответ на обратный вызов, ничего больше.

  • Он не зависит от конкретного HTML, просто дайте ему <input type="file">
  • Он не требует, чтобы ваш сервер отвечал каким-либо конкретным способом
  • Неважно, сколько файлов вы используете или где они находятся на странице

- используйте всего лишь -

$('#one-specific-file').ajaxfileupload({
  'action': '/upload.php'
});

- или сколько -

$('input[type="file"]').ajaxfileupload({
  'action': '/upload.php',
  'params': {
    'extra': 'info'
  },
  'onComplete': function(response) {
    console.log('custom handler for file:');
    alert(JSON.stringify(response));
  },
  'onStart': function() {
    if(weWantedTo) return false; // cancels upload
  },
  'onCancel': function() {
    console.log('no file selected');
  }
});
81
ответ дан Jordan Feldstein 15 August 2018 в 20:51
поделиться

Это старый вопрос, но ответа на правильный ответ у него нет, поэтому:

Вы пробовали jQuery-File-Upload ?

Здесь является примером из ссылки выше -> 1 , которая может решить вашу проблему:

$('#fileupload').fileupload({
    add: function (e, data) {
        var that = this;
        $.getJSON('/example/url', function (result) {
            data.formData = result; // e.g. {id: 123}
            $.blueimp.fileupload.prototype
                .options.add.call(that, e, data);
        });
    } 
});
1
ответ дан LAT94 15 August 2018 в 20:51
поделиться

Чтобы асинхронно загружать файл с помощью Jquery, выполните следующие шаги:

шаг 1 В вашем проекте откройте менеджер Nuget и добавьте пакет (jquery fileupload (нужно только записать его в поле поиска, он появится и установит it.)) URL: https://github.com/blueimp/jQuery-File-Upload

Шаг 2 Добавьте ниже сценарии в файлы HTML, которые уже добавлены в проект, выполнив над пакетом:

jquery.ui.widget.js

jquery.iframe-transport.js

jquery.fileupload.js

Шаг 3 Запишите управление загрузкой файлов в соответствии с приведенным ниже кодом:

<input id="upload" name="upload" type="file" />

шаг 4 напишите js-метод как uploadFile, как показано ниже:

 function uploadFile(element) {

            $(element).fileupload({

                dataType: 'json',
                url: '../DocumentUpload/upload',
                autoUpload: true,
                add: function (e, data) {           
                  // write code for implementing, while selecting a file. 
                  // data represents the file data. 
                  //below code triggers the action in mvc controller
                  data.formData =
                                    {
                                     files: data.files[0]
                                    };
                  data.submit();
                },
                done: function (e, data) {          
                   // after file uploaded
                },
                progress: function (e, data) {

                   // progress
                },
                fail: function (e, data) {

                   //fail operation
                },
                stop: function () {

                  code for cancel operation
                }
            });

        };

шаг 5 В процессе загрузки файла элементов готовой функции, чтобы инициировать процесс, как показано ниже:

$(document).ready(function()
{
    uploadFile($('#upload'));

});

Шаг 6 Запишите контроллер MVC и действие, как показано ниже:

public class DocumentUploadController : Controller
    {       

        [System.Web.Mvc.HttpPost]
        public JsonResult upload(ICollection<HttpPostedFileBase> files)
        {
            bool result = false;

            if (files != null || files.Count > 0)
            {
                try
                {
                    foreach (HttpPostedFileBase file in files)
                    {
                        if (file.ContentLength == 0)
                            throw new Exception("Zero length file!");                       
                        else 
                            //code for saving a file

                    }
                }
                catch (Exception)
                {
                    result = false;
                }
            }


            return new JsonResult()
                {
                    Data=result
                };


        }

    }
12
ответ дан Majid Golshadi 15 August 2018 в 20:51
поделиться

Ищите . Загрузите процесс загрузки для файла, асинхронно здесь: https://developer.mozilla.org/en-US/docs/Using_files_from_web_applications

Образец из ссылки

<?php
if (isset($_FILES['myFile'])) {
    // Example:
    move_uploaded_file($_FILES['myFile']['tmp_name'], "uploads/" . $_FILES['myFile']['name']);
    exit;
}
?><!DOCTYPE html>
<html>
<head>
    <title>dnd binary upload</title>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <script type="text/javascript">
        function sendFile(file) {
            var uri = "/index.php";
            var xhr = new XMLHttpRequest();
            var fd = new FormData();

            xhr.open("POST", uri, true);
            xhr.onreadystatechange = function() {
                if (xhr.readyState == 4 && xhr.status == 200) {
                    // Handle response.
                    alert(xhr.responseText); // handle response.
                }
            };
            fd.append('myFile', file);
            // Initiate a multipart/form-data upload
            xhr.send(fd);
        }

        window.onload = function() {
            var dropzone = document.getElementById("dropzone");
            dropzone.ondragover = dropzone.ondragenter = function(event) {
                event.stopPropagation();
                event.preventDefault();
            }

            dropzone.ondrop = function(event) {
                event.stopPropagation();
                event.preventDefault();

                var filesArray = event.dataTransfer.files;
                for (var i=0; i<filesArray.length; i++) {
                    sendFile(filesArray[i]);
                }
            }
        }
    </script>
</head>
<body>
    <div>
        <div id="dropzone" style="margin:30px; width:500px; height:300px; border:1px dotted grey;">Drag & drop your file here...</div>
    </div>
</body>
</html>
5
ответ дан Mark Amery 15 August 2018 в 20:51
поделиться

2017 Обновление: все еще зависит от браузеров ваших демографических применений .

Важно понять, что «новый» API HTML5 file - это не поддерживается до IE 10 . Если конкретный рынок, на который вы нацеливаетесь, имеет более высокую, чем среднюю, предварительную наклонность к более старым версиям Windows, у вас может не быть доступа к нему.

Переход к 2017 году примерно в 5% браузеров является одним из IE 6, 7, 8 или 9. Если вы направляетесь в крупную корпорацию (например, это инструмент B2B или что-то, что вы доставляете для обучения), это число может ракета. Всего несколько месяцев назад - в 2016 году - я имел дело с компанией, использующей IE8 на более чем 60% своих машин.

Итак, прежде чем что-либо делать: проверьте, какой браузер использует ваш пользователь , Если вы этого не сделаете, вы научитесь быстрому и мучительному уроку в том, почему «работает для меня» недостаточно хорош для доставки клиенту.

Мой ответ от 2008 года.


Однако существуют жизнеспособные не-JS-методы загрузки файлов. Вы можете создать iframe на странице (которую вы скрываете с помощью CSS), а затем настроить таргетинг своей формы для публикации в iframe. На главной странице не нужно двигаться.

Это «настоящая» почта, поэтому она не является полностью интерактивной. Если вам нужен статус, вам нужно что-то серверное для его обработки. Это зависит от вашего сервера. ASP.NET имеет более удобные механизмы. PHP plain не работает, но вы можете использовать Perl или модификации Apache, чтобы обойти его.

Если вам нужно несколько загрузок файлов, лучше делать каждый файл по одному ( для преодоления максимальных пределов загрузки файлов). Отправляйте первую форму в iframe, отслеживайте ее ход, используя вышеприведенное и когда он закончил, разместите вторую форму в iframe и т. Д.

Или используйте решение Java / Flash. Они намного более гибки в том, что они могут делать со своими постами ...

237
ответ дан Oli 15 August 2018 в 20:51
поделиться
  • 1
    Для записи теперь можно делать чистую загрузку файлов AJAX, если браузер поддерживает File API - developer.mozilla.org/en/using_files_from_web_applications – meleyal 25 March 2011 в 11:05
  • 2
    Если вам не нужна поддержка IE9. caniuse.com/fileapi – Oli 5 February 2014 в 04:45
  • 3
    Решение iframe довольно просто и легко получить работу – Matthew Lock 17 April 2015 в 00:45
  • 4
    это довольно старый ответ, но он немного вводил в заблуждение. IE поддерживал XHR изначально еще в IE7 и поддерживал его через ActiveX еще в IE5. w3schools.com/ajax/ajax_xmlhttprequest_create.asp . Практический способ сделать это был, конечно, нацелен на компоненты вспышки (ударной волны) или выкатывание элемента управления Flash / ActiveX (Silverlight). Если вы можете инициировать запрос и обрабатывать ответ через javascript, это ajax .. хотя, сказав, что ajax является синонимом xhr, но сам он не описывает механизм / компоненты подчеркивания, которые доставляют / обменивают полезную нагрузку. – Brett Caswell 29 October 2015 в 15:54
  • 5
    @BrettCaswell Я не говорил, что AJAX / XHR не были возможны, просто невозможно было опубликовать файл с ними по старым, но вживую версиям IE. Это было и остается полностью верным. – Oli 29 October 2015 в 16:34

Образец: если вы используете jQuery, вы можете легко загрузить файл. Это небольшой и сильный плагин jQuery, http://jquery.malsup.com/form/ .

Пример

var $bar   = $('.ProgressBar');
$('.Form').ajaxForm({
  dataType: 'json',

  beforeSend: function(xhr) {
    var percentVal = '0%';
    $bar.width(percentVal);
  },

  uploadProgress: function(event, position, total, percentComplete) {
    var percentVal = percentComplete + '%';
    $bar.width(percentVal)
  },

  success: function(response) {
    // Response
  }
});

Надеюсь, это было бы полезно

57
ответ дан Peter Mortensen 15 August 2018 в 20:51
поделиться
  • 1
    @Gary: Извините, я тоже должен был разместить этот бит. Я просто использовал новую функцию перетаскивания в HTML5; вы можете найти здесь пример: html5demos.com/file-api#view-source - просто нажмите & quot; посмотреть источник & quot ;. По существу, внутри события ondrop вы можете сделать var file = e.dataTransfer.files[0] – mpen 3 April 2013 в 16:35
  • 2
    -1 для использования jQuery и не использовать его механизм выбора и обработчики событий. addEventListener не является кросс-браузером. – Mark 22 September 2013 в 21:49
  • 3
    Потому что было бы бессмысленно добавлять отдельный ответ, который будет в основном основан на этом, с несколькими изменениями. Вместо этого этот ответ должен быть исправлен. – Mark 23 November 2013 в 18:14
  • 4
    @RainFromHeaven, пожалуйста, можете ли вы отредактировать ответ? Я не знаю, как это сделать в кросс-браузере. – Thiago Negri 27 January 2014 в 15:57
  • 5
    Все еще не работает в IE 9 и ниже. Многие пользователи по-прежнему используют эти версии IE. – Pierre 28 June 2014 в 11:48
  • 6
    Может кто-нибудь объяснить, как это можно сделать для работы в asp.net? Я использую веб-метод? Если да, на что это будет похоже? – Arbaaz 23 May 2015 в 05:23
  • 7
    Возможно, вопрос был отредактирован с тех пор, но некоторые люди в обсуждении, которое я открыл, считают, что ответ Vanilla JS не отвечает, если OP запрашивает решение jQuery (если оно существует), и такие ответы принадлежат отдельному вопросу. – Andy 31 October 2017 в 07:55
  • 8
    @ Andy Хорошо, я не согласен, и, похоже, 34 человека тоже. Если вы можете использовать jQuery, то вы, безусловно, можете использовать JavaScript. В любом случае, это сайт сообщества - это не просто OP, который я пытаюсь здесь помочь. Каждый может свободно выбирать / использовать ответ, который им больше нравится. Некоторые люди просто тяготеют к jQuery, потому что считают, что это будет намного проще / меньше строк кода, когда на самом деле им не нужны накладные расходы дополнительной библиотеки вообще. – mpen 31 October 2017 в 17:20

Я написал это в среде Rails . Это всего лишь пять строк JavaScript, если вы используете легкий плагин jQuery-формы.

Задача заключается в том, что загрузка AJAX работает, поскольку стандарт remote_form_for не понимает представления нескольких частей. Он не собирается отправлять данные файла. Rails ищет запрос AJAX.

Именно здесь вступает в игру плагин jQuery-form.

Вот код Rails для него:

<% remote_form_for(:image_form, 
                   :url => { :controller => "blogs", :action => :create_asset }, 
                   :html => { :method => :post, 
                              :id => 'uploadForm', :multipart => true }) 
                                                                        do |f| %>
 Upload a file: <%= f.file_field :uploaded_data %>
<% end %>

Вот соответствующий JavaScript:

$('#uploadForm input').change(function(){
 $(this).parent().ajaxSubmit({
  beforeSubmit: function(a,f,o) {
   o.dataType = 'json';
  },
  complete: function(XMLHttpRequest, textStatus) {
   // XMLHttpRequest.responseText will contain the URL of the uploaded image.
   // Put it in an image element you create, or do with it what you will.
   // For example, if you have an image elemtn with id "my_image", then
   //  $('#my_image').attr('src', XMLHttpRequest.responseText);
   // Will set that image tag to display the uploaded image.
  },
 });
});

И вот действие контроллера Rails, довольно ваниль:

 @image = Image.new(params[:image_form])
 @image.save
 render :text => @image.public_filename

Я использовал это в течение последних нескольких недель с Bloggity, и он работал как чемпион.

30
ответ дан random 15 August 2018 в 20:51
поделиться

Для этой цели я рекомендую использовать плагин Fine Uploader . Ваш код JavaScript будет:

$(document).ready(function() {
  $("#uploadbutton").jsupload({
    action: "addFile.do",
    onComplete: function(response){
      alert( "server response: " + response);
    }
  });
});
105
ответ дан Shiladitya 15 August 2018 в 20:51
поделиться
  • 1
    Он использует JSON - поэтому для старой версии PHP это будет невозможно. – Lorenzo Manucci 22 June 2011 в 10:35
  • 2
    Кажется намного чище, чем загрузка файла Ajax, где мне нужно включить огромный фрагмент кода, чтобы использовать эту чертову вещь. – ripper234 6 December 2011 в 16:52
  • 3
    URL теперь valums.com/ajax-upload . – Patrick Fisher 12 February 2012 в 04:07
  • 4
    «Этот плагин открыт в соответствии с GNU GPL 2 или более поздней версией и GNU LGPL 2 или более поздней. Поэтому, пока вы не распространяете копию или модифицированную версию, вам не нужно открывать свой проект. – Trantor Liu 23 July 2012 в 13:02
  • 5
    Это сайт ( fineuploader.com ), который я нашел сейчас, это V4.2. – Andrew_1510 5 February 2014 в 12:25

Вот еще одно решение по загрузке файла (без какого-либо плагина)

Использование простых Javascripts и AJAX (с индикатором выполнения)

Часть HTML

<form id="upload_form" enctype="multipart/form-data" method="post">
    <input type="file" name="file1" id="file1"><br>
    <input type="button" value="Upload File" onclick="uploadFile()">
    <progress id="progressBar" value="0" max="100" style="width:300px;"></progress>
    <h3 id="status"></h3>
    <p id="loaded_n_total"></p>
</form>

Часть JS

function _(el){
    return document.getElementById(el);
}
function uploadFile(){
    var file = _("file1").files[0];
    // alert(file.name+" | "+file.size+" | "+file.type);
    var formdata = new FormData();
    formdata.append("file1", file);
    var ajax = new XMLHttpRequest();
    ajax.upload.addEventListener("progress", progressHandler, false);
    ajax.addEventListener("load", completeHandler, false);
    ajax.addEventListener("error", errorHandler, false);
    ajax.addEventListener("abort", abortHandler, false);
    ajax.open("POST", "file_upload_parser.php");
    ajax.send(formdata);
}
function progressHandler(event){
    _("loaded_n_total").innerHTML = "Uploaded "+event.loaded+" bytes of "+event.total;
    var percent = (event.loaded / event.total) * 100;
    _("progressBar").value = Math.round(percent);
    _("status").innerHTML = Math.round(percent)+"% uploaded... please wait";
}
function completeHandler(event){
    _("status").innerHTML = event.target.responseText;
    _("progressBar").value = 0;
}
function errorHandler(event){
    _("status").innerHTML = "Upload Failed";
}
function abortHandler(event){
    _("status").innerHTML = "Upload Aborted";
}

Часть PHP

<?php
$fileName = $_FILES["file1"]["name"]; // The file name
$fileTmpLoc = $_FILES["file1"]["tmp_name"]; // File in the PHP tmp folder
$fileType = $_FILES["file1"]["type"]; // The type of file it is
$fileSize = $_FILES["file1"]["size"]; // File size in bytes
$fileErrorMsg = $_FILES["file1"]["error"]; // 0 for false... and 1 for true
if (!$fileTmpLoc) { // if file not chosen
    echo "ERROR: Please browse for a file before clicking the upload button.";
    exit();
}
if(move_uploaded_file($fileTmpLoc, "test_uploads/$fileName")){ // assuming the directory name 'test_uploads'
    echo "$fileName upload is complete";
} else {
    echo "move_uploaded_file function failed";
}
?>

Вот приложение EXAMPLE

20
ответ дан Siddhartha Chowdhury 15 August 2018 в 20:51
поделиться

Самый простой и самый надежный способ, который я сделал в прошлом, - просто нацелить скрытый тег iFrame на вашу форму - тогда он будет отправляться в iframe без перезагрузки страницы.

То есть если вы не хотите использовать плагин, JavaScript или любые другие формы «магии», отличные от HTML. Конечно, вы можете объединить это с JavaScript или что у вас есть ...

<form target="iframe" action="" method="post" enctype="multipart/form-data">
    <input name="file" type="file" />
    <input type="button" value="Upload" />
</form>

<iframe name="iframe" id="iframe" style="display:none" ></iframe>

Вы также можете прочитать содержимое iframe onLoad для ошибок сервера или ответов об успешности, а затем вывести их пользователю.

Chrome, iFrames и onLoad

-note - вам нужно только читать, если вы заинтересованы в том, как настроить блокиратор пользовательского интерфейса при загрузке / загрузке

В настоящее время Chrome не запускает событие onLoad для iframe, когда он используется для передачи файлов. Firefox, IE и Edge запускают событие onload для передачи файлов.

Единственным решением, которое я нашел для Chrome, было использование cookie.

Для этого в основном при загрузке / загрузке:

  • [Сторона клиента] Начните интервал поиска файла cookie
  • [Сторона сервера] Сделайте все, что вам нужно, с файловыми данными
  • [Server Side] Установите файл cookie для клиентского интервала
  • [Клиентская сторона] Интервал видит файл cookie и использует его как событие onLoad. Например, вы можете запустить блокировщик пользовательского интерфейса, а затем onLoad (или при создании cookie) вы удалите блокиратор пользовательского интерфейса.

Использование файла cookie для этого является уродливым, но оно работает.

Я сделал плагин jQuery для решения этой проблемы для Chrome при загрузке, вы можете найти здесь

https://github.com/ArtisticPhoenix/jQuery-Plugins/blob /master/iDownloader.js

Этот же основной принцип применяется и к загрузке.

Чтобы использовать загрузчик (включая JS, очевидно)

 $('body').iDownloader({
     "onComplete" : function(){
          $('#uiBlocker').css('display', 'none'); //hide ui blocker on complete
     }
 });

 $('somebuttion').click( function(){
      $('#uiBlocker').css('display', 'block'); //block the UI
      $('body').iDownloader('download', 'htttp://example.com/location/of/download');
 });

И на стороне сервера, непосредственно перед передачей данных файла, создайте файл cookie

 setcookie('iDownloader', true, time() + 30, "/");

Плагин увидит файл cookie, а затем вызовет обратный вызов onComplete.

88
ответ дан tiermix 15 August 2018 в 20:51
поделиться
  • 1
    Да, вы можете отправлять POST в iframe и записывать файл там. У меня очень ограниченный опыт в этом, поэтому я не могу прокомментировать это. – Mattias 3 October 2008 в 18:21
  • 2
    Небольшое замечание: в последних версиях хром и firefox это возможно, stackoverflow.com/questions/4856917/… – Alleo 3 November 2011 в 20:57
  • 3
    Я люблю это. Если бы только кто-то мог упомянуть о потенциальных проблемах с этим блестящим решением. Я действительно не понимаю, почему люди борются и используют эти неуклюжие библиотеки и плагины, когда есть решение. – Yevgeniy Afanasyev 5 January 2015 в 23:45
  • 4
    Ну, я думаю, причина в том, чтобы показать некоторую информацию о ходе во время загрузки. – Prakhar Mishra 28 June 2016 в 11:19

Преобразовать файл в base64, используя | HTML5 readAsDataURL () или некоторый кодер base64 . Здесь скрипт

var reader = new FileReader();

        reader.onload = function(readerEvt) {
            var binaryString = readerEvt.target.result;
            document.getElementById("base64textarea").value = btoa(binaryString);
        };

        reader.readAsBinaryString(file);

Затем для извлечения:

window.open("data:application/octet-stream;base64," + base64);
8
ответ дан tnt-rox 15 August 2018 в 20:51
поделиться

Простой загрузчик Ajax - это еще одна опция:

https://github.com/LPology/Simple-Ajax-Uploader

  • Cross -browser - работает в IE7 +, Firefox, Chrome, Safari, Opera
  • Поддерживает несколько одновременных загрузок - даже в браузерах, отличных от HTML5
  • Нет Flash или внешнего CSS - просто один файл 5Kb Javascript
  • Необязательная встроенная поддержка полнопроходных баров (с использованием расширения PHP APC)
  • Гибкий и настраиваемый - используйте любой элемент в качестве кнопки загрузки, стиль ваших собственных индикаторов прогресса
  • Не требуется никаких форм, просто укажите элемент, который будет использоваться в качестве кнопки загрузки
  • Лицензия MIT - бесплатно использовать в коммерческом проекте

Пример использования:

var uploader = new ss.SimpleUpload({
    button: $('#uploadBtn'), // upload button
    url: '/uploadhandler', // URL of server-side upload handler
    name: 'userfile', // parameter name of the uploaded file
    onSubmit: function() {
        this.setProgressBar( $('#progressBar') ); // designate elem as our progress bar
    },
    onComplete: function(file, response) {
        // do whatever after upload is finished
    }
});
29
ответ дан user1091949 15 August 2018 в 20:51
поделиться
  • 1
    Это кажется наиболее перспективным до сих пор, вы меня в IE7+! Попробуйте это сейчас. благодаря – Pierre 28 June 2014 в 11:53

Вы можете просто загрузить jQuery .ajax().

HTML:

<form id="upload-form">
    <div>
        <label for="file">File:</label>
        <input type="file" id="file" name="file" />
        <progress class="progress" value="0" max="100"></progress>
    </div>
    <hr />
    <input type="submit" value="Submit" />
</form>

CSS

.progress { display: none; }

Javascript:

$(document).ready(function(ev) {
    $("#upload-form").on('submit', (function(ev) {
        ev.preventDefault();
        $.ajax({
            xhr: function() {
                var progress = $('.progress'),
                    xhr = $.ajaxSettings.xhr();

                progress.show();

                xhr.upload.onprogress = function(ev) {
                    if (ev.lengthComputable) {
                        var percentComplete = parseInt((ev.loaded / ev.total) * 100);
                        progress.val(percentComplete);
                        if (percentComplete === 100) {
                            progress.hide().val(0);
                        }
                    }
                };

                return xhr;
            },
            url: 'upload.php',
            type: 'POST',
            data: new FormData(this),
            contentType: false,
            cache: false,
            processData: false,
            success: function(data, status, xhr) {
                // ...
            },
            error: function(xhr, status, error) {
                // ...
            }
       });
    }));
});
42
ответ дан Zayn Ali 15 August 2018 в 20:51
поделиться
2
ответ дан Alister Norris 5 September 2018 в 20:18
поделиться
0
ответ дан Joe Clinton 5 September 2018 в 20:18
поделиться
57
ответ дан Peter Mortensen 5 September 2018 в 20:18
поделиться
88
ответ дан tiermix 5 September 2018 в 20:18
поделиться
Другие вопросы по тегам:

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