jQuery Ajax Завантаження файлів


755

Чи можу я використовувати наступний код jQuery для виконання завантаження файлів за допомогою методу POST запиту ajax?

$.ajax({
    type: "POST",
    timeout: 50000,
    url: url,
    data: dataString,
    success: function (data) {
        alert('success');
        return false;
    }
});

Якщо це можливо, мені потрібно заповнити dataчастину? Це правильний шлях? Я лише розміщую файл на стороні сервера.

Я гуляв навколо, але те, що я знайшов, був плагіном, хоча в плані я не хочу його використовувати. Принаймні на даний момент.


Ajax не підтримує завантаження файлів, замість цього слід використовувати iframe
antyrat

1
Питання, пов’язані з цим: stackoverflow.com/questions/6974684/…
Натан Кооп

Відповіді:


596

Завантаження файлу є НЕ можлива через AJAX.
Ви можете завантажити файл, не оновлюючи сторінку, використовуючи IFrame.
Детальнішу інформацію можна переглянути тут .


ОНОВЛЕННЯ

За допомогою XHR2 підтримується завантаження файлів через AJAX. Наприклад, через FormDataоб'єкт, але, на жаль, він не підтримується всіма / старими браузерами.

FormData підтримка починається з наступних версій веб-переглядачів.

  • IE 10+
  • Firefox 4.0+
  • Chrome 7+
  • Сафарі 5+
  • Opera 12+

Більш детально див. Посилання MDN .


41
Ось перелік конкретних браузерів, які не підтримуються: caniuse.com/#search=FormData Також я цього не перевіряв, але ось поліфайл для FormData gist.github.com/3120320
Ryan White

152
Зокрема, IE <10 не для тих, хто лінивий читати посилання.
Кевін

22
@Synexis ні, нам більше не доведеться чекати так довго, тому що всі IE мають лише 22% світового ринку та 27% у США і швидко падають. Ймовірно, це люди старше 70 років. Тож швидше тоді IE, що диктує, що розробники повинні робити IE, доведеться або формувати, або виходити з гонки.
Дрю Калдер

30
@DrewCalder Більшість користувачів IE - офісні працівники, які не мають вибору браузера використовувати через політику компанії. Я не думаю, що вік має багато спільного з цим. Я здогадуюсь, що більшість людей> 70 отримують своє потомство, щоб встановити Chrome або FF замість нього :)
Nicolas Connault

3
Це посилання дійсно допомогло мені зрозуміти голий мінімум. Мені не потрібно було використовувати запит xhr. Якщо ви використовуєте Ajax переконайтеся , щоб встановити enctypeна "form/multipart"!
Світлий

316

Iframes більше не потрібні для завантаження файлів через ajax. Нещодавно я це робив сам. Перегляньте ці сторінки:

Використання завантажень файлів HTML5 за допомогою AJAX та jQuery

http://dev.w3.org/2006/webapi/FileAPI/#FileReader-interface

Оновили відповідь та очистили її. Використовуйте функцію getSize для перевірки розміру або використання функції getType для перевірки типів. Додано HTML-код та css-панель прогресу.

var Upload = function (file) {
    this.file = file;
};

Upload.prototype.getType = function() {
    return this.file.type;
};
Upload.prototype.getSize = function() {
    return this.file.size;
};
Upload.prototype.getName = function() {
    return this.file.name;
};
Upload.prototype.doUpload = function () {
    var that = this;
    var formData = new FormData();

    // add assoc key values, this will be posts values
    formData.append("file", this.file, this.getName());
    formData.append("upload_file", true);

    $.ajax({
        type: "POST",
        url: "script",
        xhr: function () {
            var myXhr = $.ajaxSettings.xhr();
            if (myXhr.upload) {
                myXhr.upload.addEventListener('progress', that.progressHandling, false);
            }
            return myXhr;
        },
        success: function (data) {
            // your callback here
        },
        error: function (error) {
            // handle error
        },
        async: true,
        data: formData,
        cache: false,
        contentType: false,
        processData: false,
        timeout: 60000
    });
};

Upload.prototype.progressHandling = function (event) {
    var percent = 0;
    var position = event.loaded || event.position;
    var total = event.total;
    var progress_bar_id = "#progress-wrp";
    if (event.lengthComputable) {
        percent = Math.ceil(position / total * 100);
    }
    // update progressbars classes so it fits your code
    $(progress_bar_id + " .progress-bar").css("width", +percent + "%");
    $(progress_bar_id + " .status").text(percent + "%");
};

Як користуватися класом Upload

//Change id to your id
$("#ingredient_file").on("change", function (e) {
    var file = $(this)[0].files[0];
    var upload = new Upload(file);

    // maby check size or type here with upload.getSize() and upload.getType()

    // execute upload
    upload.doUpload();
});

HTML код коду прогресу

<div id="progress-wrp">
    <div class="progress-bar"></div>
    <div class="status">0%</div>
</div>

Код CSS прогресу

#progress-wrp {
  border: 1px solid #0099CC;
  padding: 1px;
  position: relative;
  height: 30px;
  border-radius: 3px;
  margin: 10px;
  text-align: left;
  background: #fff;
  box-shadow: inset 1px 3px 6px rgba(0, 0, 0, 0.12);
}

#progress-wrp .progress-bar {
  height: 100%;
  border-radius: 3px;
  background-color: #f39ac7;
  width: 0;
  box-shadow: inset 1px 1px 10px rgba(0, 0, 0, 0.11);
}

#progress-wrp .status {
  top: 3px;
  left: 50%;
  position: absolute;
  display: inline-block;
  color: #000000;
}

3
Ви можете скоріше скопіювати код та скористатися ним. Просто змініть деякі імена id та назви класів. Будь-яке налаштування відбувається самостійно.
Ziinloader

4
Зауважте, що myXhr здається глобальним, а також ім'ям, розміром та типом. Також краще використовувати "beforeSend", щоб збільшити вже створений XMLHttpRequest об'єкт, а не використовувати "xhr" для його створення, а потім змінити його.
awatts

8
Я не думаю, що ми можемо використовувати це так, як це @Ziinloader. Ви використовуєте який - то локальний метод , який не входить в комплект : writer(catchFile). Що таке writer()?
tandrewnichols

4
Що робити, якщо дані також містять кілька полів разом із файлом для завантаження?
raju

2
@Ziinloader Це надзвичайно корисний приклад, який я бачу, що ви кілька разів поверталися та підтримували його. Дійсно відповідь, що коштує набагато більше, ніж той, який я можу дати.
Регулярний Джо

190

Можлива публікація та завантаження файлу Ajax. Я використовую jQuery $.ajaxфункцію для завантаження своїх файлів. Я намагався використовувати об’єкт XHR, але не зміг отримати результати на стороні сервера з PHP.

var formData = new FormData();
formData.append('file', $('#file')[0].files[0]);

$.ajax({
       url : 'upload.php',
       type : 'POST',
       data : formData,
       processData: false,  // tell jQuery not to process the data
       contentType: false,  // tell jQuery not to set contentType
       success : function(data) {
           console.log(data);
           alert(data);
       }
});

Як бачите, ви повинні створити об’єкт FormData, порожній або з (серіалізований? - $('#yourForm').serialize())існуючий вигляд, а потім приєднати вхідний файл.

Ось додаткова інформація: - Як завантажити файл за допомогою jQuery.ajax та FormData - Завантаження файлів через jQuery, об’єкт FormData надається та відсутність імені файлу, GET запит

Для процесу PHP ви можете використовувати щось подібне:

//print_r($_FILES);
$fileName = $_FILES['file']['name'];
$fileType = $_FILES['file']['type'];
$fileError = $_FILES['file']['error'];
$fileContent = file_get_contents($_FILES['file']['tmp_name']);

if($fileError == UPLOAD_ERR_OK){
   //Processes your file here
}else{
   switch($fileError){
     case UPLOAD_ERR_INI_SIZE:   
          $message = 'Error al intentar subir un archivo que excede el tamaño permitido.';
          break;
     case UPLOAD_ERR_FORM_SIZE:  
          $message = 'Error al intentar subir un archivo que excede el tamaño permitido.';
          break;
     case UPLOAD_ERR_PARTIAL:    
          $message = 'Error: no terminó la acción de subir el archivo.';
          break;
     case UPLOAD_ERR_NO_FILE:    
          $message = 'Error: ningún archivo fue subido.';
          break;
     case UPLOAD_ERR_NO_TMP_DIR: 
          $message = 'Error: servidor no configurado para carga de archivos.';
          break;
     case UPLOAD_ERR_CANT_WRITE: 
          $message= 'Error: posible falla al grabar el archivo.';
          break;
     case  UPLOAD_ERR_EXTENSION: 
          $message = 'Error: carga de archivo no completada.';
          break;
     default: $message = 'Error: carga de archivo no completada.';
              break;
    }
      echo json_encode(array(
               'error' => true,
               'message' => $message
            ));
}

2
На яку бібліотеку jquery мені потрібно посилатися, щоб запустити цей код?
Рейден Блек

Відповідь була написана у 2014 році. Версія JQuery була 1.10. Я не пробував із більш новими версіями.
pedrozopayares

5
formData.append('file', $('#file')[0].files[0]);повертається undefinedі не console.log(formData) має нічого, окрім_proto_
Якоб Убайді

1
Не підтримується IE 9, якщо хтось застряг у тому ж пеклі, що і я
CountMurphy

3
У мене це на роботі ... Прищипте мене, я на jQuery Ajax файл завантажуйте небеса! var formData = new FormData(); formData.append('file', document.getElementById('file').files[0]); $.ajax({ url : $("form[name='uploadPhoto']").attr("action"), type : 'POST', data : formData, processData: false, // tell jQuery not to process the data contentType: false, // tell jQuery not to set contentType success : function(data) { console.log(data); alert(data); } });
TARKUS

104

Проста форма завантаження

 <script>
   //form Submit
   $("form").submit(function(evt){	 
      evt.preventDefault();
      var formData = new FormData($(this)[0]);
   $.ajax({
       url: 'fileUpload',
       type: 'POST',
       data: formData,
       async: false,
       cache: false,
       contentType: false,
       enctype: 'multipart/form-data',
       processData: false,
       success: function (response) {
         alert(response);
       }
   });
   return false;
 });
</script>
<!--Upload Form-->
<form>
  <table>
    <tr>
      <td colspan="2">File Upload</td>
    </tr>
    <tr>
      <th>Select File </th>
      <td><input id="csv" name="csv" type="file" /></td>
    </tr>
    <tr>
      <td colspan="2">
        <input type="submit" value="submit"/> 
      </td>
    </tr>
  </table>
</form>


сер, що таке js, що використовувався в цьому прикладі, чи є специфічний плагін jquery для цього ... у мене є питання, на який я вказав, чи можете ви, будь ласка, перевірити моє запитання. Я хочу завантажити тут декілька файлів або зображень посилання stackoverflow.com/questions/28644200 / ...
Браунман Ревівал

19
$ (Це) [0] є це
machineaddict

2
Який параметр на сервері для розміщеного файлу? Чи можете ви опублікувати серверну частину.
FrenkyB

@FrenkyB та інші - файли на сервері (у PHP) не зберігаються у змінній $ _POST - вони зберігаються у змінній $ _FILES. У цьому випадку ви отримаєте доступ до нього за допомогою $ _FILES ["csv"], оскільки "csv" - це атрибут імені вхідного тегу.
dev_masta

68

Я досить запізнююсь на це, але я шукав рішення для завантаження зображень на основі аякса, і відповідь, яку я шукав, була начебто розсіяна по цій публікації. Рішення, на якому я зупинився, стосувалося об'єкта FormData. Я зібрав основну форму коду, який я склав разом. Ви можете бачити, як демонструється, як додати спеціальне поле до форми за допомогою fd.append (), а також як обробляти дані відповіді, коли виконано запит ajax.

Завантажити html:

<!DOCTYPE html>
<html>
<head>
    <title>Image Upload Form</title>
    <script src="//code.jquery.com/jquery-1.9.1.js"></script>
    <script type="text/javascript">
        function submitForm() {
            console.log("submit event");
            var fd = new FormData(document.getElementById("fileinfo"));
            fd.append("label", "WEBUPLOAD");
            $.ajax({
              url: "upload.php",
              type: "POST",
              data: fd,
              processData: false,  // tell jQuery not to process the data
              contentType: false   // tell jQuery not to set contentType
            }).done(function( data ) {
                console.log("PHP Output:");
                console.log( data );
            });
            return false;
        }
    </script>
</head>

<body>
    <form method="post" id="fileinfo" name="fileinfo" onsubmit="return submitForm();">
        <label>Select a file:</label><br>
        <input type="file" name="file" required />
        <input type="submit" value="Upload" />
    </form>
    <div id="output"></div>
</body>
</html>

Якщо ви працюєте з php, ось спосіб обробки завантаження, що включає використання обох користувальницьких полів, продемонстрованих у наведеному вище html.

Upload.php

<?php
if ($_POST["label"]) {
    $label = $_POST["label"];
}
$allowedExts = array("gif", "jpeg", "jpg", "png");
$temp = explode(".", $_FILES["file"]["name"]);
$extension = end($temp);
if ((($_FILES["file"]["type"] == "image/gif")
|| ($_FILES["file"]["type"] == "image/jpeg")
|| ($_FILES["file"]["type"] == "image/jpg")
|| ($_FILES["file"]["type"] == "image/pjpeg")
|| ($_FILES["file"]["type"] == "image/x-png")
|| ($_FILES["file"]["type"] == "image/png"))
&& ($_FILES["file"]["size"] < 200000)
&& in_array($extension, $allowedExts)) {
    if ($_FILES["file"]["error"] > 0) {
        echo "Return Code: " . $_FILES["file"]["error"] . "<br>";
    } else {
        $filename = $label.$_FILES["file"]["name"];
        echo "Upload: " . $_FILES["file"]["name"] . "<br>";
        echo "Type: " . $_FILES["file"]["type"] . "<br>";
        echo "Size: " . ($_FILES["file"]["size"] / 1024) . " kB<br>";
        echo "Temp file: " . $_FILES["file"]["tmp_name"] . "<br>";

        if (file_exists("uploads/" . $filename)) {
            echo $filename . " already exists. ";
        } else {
            move_uploaded_file($_FILES["file"]["tmp_name"],
            "uploads/" . $filename);
            echo "Stored in: " . "uploads/" . $filename;
        }
    }
} else {
    echo "Invalid file";
}
?>

я Cross origin requests are only supported for protocol schemes: http, data, chrome, chrome-extension, https,
розумію,

2
@HogRider - якщо ви повідомляєте про своє повідомлення про помилку, це перший результат: stackoverflow.com/questions/10752055/… Чи отримуєте ви доступ до своїх веб-сторінок локально file://, а не використовуєте веб-сервер? З іншого боку, це не найкраща практика просто копіювати та вставляти код наосліп, попередньо не розуміючи цього. Я рекомендую вам переглядати код по черзі, щоб зрозуміти, що відбувається перед тим, як використовувати код.
colincameron

@colincameron дякую вам за уточнення кількох речей, які я проходив по ньому за рядком, і я дуже не розумію, тому я задав питання, щоб хтось міг уточнити мої сумніви. Я використовую локальний шлях xampp, щоб бути точним. Чи можу я задати питання, яке, можливо, ви можете уточнити?
Відродження Браунмена

@Brownman Revival: Я знаю, що це занадто пізно для відповіді. Ви отримали помилку хрестового походження, оскільки ви відкрили файл HTML як файл, ніж запустили його з сервера.
Адарш Мохан

@AdarshMohan я оцінюю відповідь, як ви пропонуєте мені зробити це, щоб зробити це правильно?
Відродження Браумена

31

Завантажити AJAX дійсно можливо за допомогою XMLHttpRequest(). Немає необхідних кадрів. Може бути показаний хід завантаження.

Докладніше див.: Відповідь https://stackoverflow.com/a/4943774/873282 на запитання прогрес завантаження jQuery та завантаження файлу AJAX .


24
На жаль, IE <10 не підтримує це.
Саша Чедигов

1
Коли ви просто хочете вказати на іншу сторінку як відповідь, ви можете проголосувати за закриття як дубката або залишити коментар під запитанням. Це повідомлення - не відповідь. Пост такого роду схожий на спробу обробляти реп.
mickmackusa

18

Ось як я працював над цим:

HTML

<input type="file" id="file">
<button id='process-file-button'>Process</button>

JS

$('#process-file-button').on('click', function (e) {
    let files = new FormData(), // you can consider this as 'data bag'
        url = 'yourUrl';

    files.append('fileName', $('#file')[0].files[0]); // append selected file to the bag named 'file'

    $.ajax({
        type: 'post',
        url: url,
        processData: false,
        contentType: false,
        data: files,
        success: function (response) {
            console.log(response);
        },
        error: function (err) {
            console.log(err);
        }
    });
});

PHP

if (isset($_FILES) && !empty($_FILES)) {
    $file = $_FILES['fileName'];
    $name = $file['name'];
    $path = $file['tmp_name'];


    // process your file

}

2
Що мені найбільше допомогло в цьому, $('#file')[0].files[0]це якийсь дивний шлях JS, не вимагаючи належного<form>
ffgpga08

Це повне рішення, PHP біт теж допомагає.
cdsaenz

14

У випадку, якщо ви хочете зробити це так:

$.upload( form.action, new FormData( myForm))
.progress( function( progressEvent, upload) {
    if( progressEvent.lengthComputable) {
        var percent = Math.round( progressEvent.loaded * 100 / progressEvent.total) + '%';
        if( upload) {
            console.log( percent + ' uploaded');
        } else {
            console.log( percent + ' downloaded');
        }
    }
})
.done( function() {
    console.log( 'Finished upload');                    
});

ніж

https://github.com/lgersman/jquery.orangevolt-ampere/blob/master/src/jquery.upload.js

може бути вашим рішенням.


Де метод завантаження в $ object, вищезазначене посилання не існує
охолодження


2
Дякуємо, що опублікували свою відповідь! Будь ласка, уважно прочитайте FAQ щодо самореклами . Також зауважте, що потрібно надсилати відмову щоразу, коли ви посилаєтесь на власний сайт / продукт.
Ендрю Барбер

13
  • Використовуйте прихований кадр iframe та встановіть ціль форми на ім’я цього iframe. Таким чином, коли форма подається, буде оновлений лише кадр.
  • Зареєструйте обробника події для події завантаження iframe, щоб проаналізувати відповідь.

Детальніше про мій пост у блозі: http://blog.manki.in/2011/08/ajax-fie-upload.html .


Уникайте іфреймів, де це можливо
Bhargav Nanekalva

@BhargavNanekalva, що ти хвилюєш?
aswzen

13
$("#submit_car").click( function() {
  var formData = new FormData($('#car_cost_form')[0]);
$.ajax({
       url: 'car_costs.php',
       data: formData,
       async: false,
       contentType: false,
       processData: false,
       cache: false,
       type: 'POST',
       success: function(data)
       {
       },
     })    return false;    
});

редагувати: Примітка типу контенту та даних обробки Ви можете просто використовувати це для завантаження файлів через Ajax ...... введення подання не може бути поза елементом форми :)


3
Використовуючи цей метод, ви можете розміщувати форму, але не з полями 'файл'. Це питання стосується завантаження файлів.
Джомі Джон

11

Оновлення 2019 року:

html

<form class="fr" method='POST' enctype="multipart/form-data"> {% csrf_token %}
<textarea name='text'>
<input name='example_image'>
<button type="submit">
</form>

js

$(document).on('submit', '.fr', function(){

    $.ajax({ 
        type: 'post', 
        url: url, <--- you insert proper URL path to call your views.py function here.
        enctype: 'multipart/form-data',
        processData: false,
        contentType: false,
        data: new FormData(this) ,
        success: function(data) {
             console.log(data);
        }
        });
        return false;

    });

views.py

form = ThisForm(request.POST, request.FILES)

if form.is_valid():
    text = form.cleaned_data.get("text")
    example_image = request.FILES['example_image']

1
Як це покращити будь-яку відповідь, що вже дається? Також у цій відповіді згадується файл views.py, який є Django і не має нічого спільного з питанням.
dirkgroten

6
Оскільки ця проблема виявляється порівняно під час використання Django, і якщо ви використовуєте Django, тут не так багато напрямків щодо її вирішення. Я думав, що запропоную активну допомогу на випадок, якщо хтось приїде сюди, як я це зробив у майбутньому. Маєш нерівний день?
Джей

9

Використовуйте FormData. Це працює дуже добре :-) ...

var jform = new FormData();
jform.append('user',$('#user').val());
jform.append('image',$('#image').get(0).files[0]); // Here's the important bit

$.ajax({
    url: '/your-form-processing-page-url-here',
    type: 'POST',
    data: jform,
    dataType: 'json',
    mimeType: 'multipart/form-data', // this too
    contentType: false,
    cache: false,
    processData: false,
    success: function(data, status, jqXHR){
        alert('Hooray! All is well.');
        console.log(data);
        console.log(status);
        console.log(jqXHR);

    },
    error: function(jqXHR,status,error){
        // Hopefully we should never reach here
        console.log(jqXHR);
        console.log(status);
        console.log(error);
    }
});

ось що: ('user', $ ('# user'). val ());
rahim.nagori

textbox with id = "user" додано до форми @ rahim.nagori
Alp Altunel

7

Я здійснив вибір декількох файлів із миттєвим попереднім переглядом та завантаженням після видалення непотрібних файлів із попереднього перегляду через ajax.

Детальну документацію можна знайти тут: http://anasthecoder.blogspot.ae/2014/12/multi-file-select-preview-without.html

Демо: http://jsfiddle.net/anas/6v8Kz/7/embedded/result/

jsFiddle: http://jsfiddle.net/anas/6v8Kz/7/

Javascript:

    $(document).ready(function(){
    $('form').submit(function(ev){
        $('.overlay').show();
        $(window).scrollTop(0);
        return upload_images_selected(ev, ev.target);
    })
})
function add_new_file_uploader(addBtn) {
    var currentRow = $(addBtn).parent().parent();
    var newRow = $(currentRow).clone();
    $(newRow).find('.previewImage, .imagePreviewTable').hide();
    $(newRow).find('.removeButton').show();
    $(newRow).find('table.imagePreviewTable').find('tr').remove();
    $(newRow).find('input.multipleImageFileInput').val('');
    $(addBtn).parent().parent().parent().append(newRow);
}

function remove_file_uploader(removeBtn) {
    $(removeBtn).parent().parent().remove();
}

function show_image_preview(file_selector) {
    //files selected using current file selector
    var files = file_selector.files;
    //Container of image previews
    var imageContainer = $(file_selector).next('table.imagePreviewTable');
    //Number of images selected
    var number_of_images = files.length;
    //Build image preview row
    var imagePreviewRow = $('<tr class="imagePreviewRow_0"><td valign=top style="width: 510px;"></td>' +
        '<td valign=top><input type="button" value="X" title="Remove Image" class="removeImageButton" imageIndex="0" onclick="remove_selected_image(this)" /></td>' +
        '</tr> ');
    //Add image preview row
    $(imageContainer).html(imagePreviewRow);
    if (number_of_images > 1) {
        for (var i =1; i<number_of_images; i++) {
            /**
             *Generate class name of the respective image container appending index of selected images, 
             *sothat we can match images selected and the one which is previewed
             */
            var newImagePreviewRow = $(imagePreviewRow).clone().removeClass('imagePreviewRow_0').addClass('imagePreviewRow_'+i);
            $(newImagePreviewRow).find('input[type="button"]').attr('imageIndex', i);
            $(imageContainer).append(newImagePreviewRow);
        }
    }
    for (var i = 0; i < files.length; i++) {
        var file = files[i];
        /**
         * Allow only images
         */
        var imageType = /image.*/;
        if (!file.type.match(imageType)) {
          continue;
        }

        /**
         * Create an image dom object dynamically
         */
        var img = document.createElement("img");

        /**
         * Get preview area of the image
         */
        var preview = $(imageContainer).find('tr.imagePreviewRow_'+i).find('td:first');

        /**
         * Append preview of selected image to the corresponding container
         */
        preview.append(img); 

        /**
         * Set style of appended preview(Can be done via css also)
         */
        preview.find('img').addClass('previewImage').css({'max-width': '500px', 'max-height': '500px'});

        /**
         * Initialize file reader
         */
        var reader = new FileReader();
        /**
         * Onload event of file reader assign target image to the preview
         */
        reader.onload = (function(aImg) { return function(e) { aImg.src = e.target.result; }; })(img);
        /**
         * Initiate read
         */
        reader.readAsDataURL(file);
    }
    /**
     * Show preview
     */
    $(imageContainer).show();
}

function remove_selected_image(close_button)
{
    /**
     * Remove this image from preview
     */
    var imageIndex = $(close_button).attr('imageindex');
    $(close_button).parents('.imagePreviewRow_' + imageIndex).remove();
}

function upload_images_selected(event, formObj)
{
    event.preventDefault();
    //Get number of images
    var imageCount = $('.previewImage').length;
    //Get all multi select inputs
    var fileInputs = document.querySelectorAll('.multipleImageFileInput');
    //Url where the image is to be uploaded
    var url= "/upload-directory/";
    //Get number of inputs
    var number_of_inputs = $(fileInputs).length; 
    var inputCount = 0;

    //Iterate through each file selector input
    $(fileInputs).each(function(index, input){

        fileList = input.files;
        // Create a new FormData object.
        var formData = new FormData();
        //Extra parameters can be added to the form data object
        formData.append('bulk_upload', '1');
        formData.append('username', $('input[name="username"]').val());
        //Iterate throug each images selected by each file selector and find if the image is present in the preview
        for (var i = 0; i < fileList.length; i++) {
            if ($(input).next('.imagePreviewTable').find('.imagePreviewRow_'+i).length != 0) {
                var file = fileList[i];
                // Check the file type.
                if (!file.type.match('image.*')) {
                    continue;
                }
                // Add the file to the request.
                formData.append('image_uploader_multiple[' +(inputCount++)+ ']', file, file.name);
            }
        }
        // Set up the request.
        var xhr = new XMLHttpRequest();
        xhr.open('POST', url, true);
        xhr.onload = function () {
            if (xhr.status === 200) {
                var jsonResponse = JSON.parse(xhr.responseText);
                if (jsonResponse.status == 1) {
                    $(jsonResponse.file_info).each(function(){
                        //Iterate through response and find data corresponding to each file uploaded
                        var uploaded_file_name = this.original;
                        var saved_file_name = this.target;
                        var file_name_input = '<input type="hidden" class="image_name" name="image_names[]" value="' +saved_file_name+ '" />';
                        file_info_container.append(file_name_input);

                        imageCount--;
                    })
                    //Decrement count of inputs to find all images selected by all multi select are uploaded
                    number_of_inputs--;
                    if(number_of_inputs == 0) {
                        //All images selected by each file selector is uploaded
                        //Do necessary acteion post upload
                        $('.overlay').hide();
                    }
                } else {
                    if (typeof jsonResponse.error_field_name != 'undefined') {
                        //Do appropriate error action
                    } else {
                        alert(jsonResponse.message);
                    }
                    $('.overlay').hide();
                    event.preventDefault();
                    return false;
                }
            } else {
                /*alert('Something went wrong!');*/
                $('.overlay').hide();
                event.preventDefault();
            }
        };
        xhr.send(formData);
    })

    return false;
}

@Bhargav: Будь ласка, дивіться повідомлення в блозі для пояснень: goo.gl/umgFFy . Якщо у вас все ще є запити, поверніться до мене Спасибі
Ima

7

Я обробляв їх у простому коді. Ви можете завантажити робочу демонстрацію звідси

Для вашого випадку це дуже можливо. Я крок за кроком підкажу вам, як ви можете завантажити файл на сервер за допомогою jqery AJAX.

Спершу давайте створимо HTML-файл, щоб додати наступний елемент файлу форми, як показано нижче.

<form action="" id="formContent" method="post" enctype="multipart/form-data" >
         <input  type="file" name="file"  required id="upload">
         <button class="submitI" >Upload Image</button> 
</form>

По-друге, створіть файл jquery.js і додайте наступний код для обробки подання нашого файлу на сервер

    $("#formContent").submit(function(e){
        e.preventDefault();

    var formdata = new FormData(this);

        $.ajax({
            url: "ajax_upload_image.php",
            type: "POST",
            data: formdata,
            mimeTypes:"multipart/form-data",
            contentType: false,
            cache: false,
            processData: false,
            success: function(){
                alert("file successfully submitted");
            },error: function(){
                alert("okey");
            }
         });
      });
    });

Там ви й зробили. Дивитись більше


7

Використання FormData - це спосіб пройти, як зазначено у багатьох відповідях. ось трохи коду, який чудово працює для цієї мети. Я також згоден з коментарем вкладення блоків ajax для завершення складних обставин. Включаючи e.PreventDefault (); на мій досвід робить код більш сумісним у браузері.

    $('#UploadB1').click(function(e){        
    e.preventDefault();

    if (!fileupload.valid()) {
        return false;            
    }

    var myformData = new FormData();        
    myformData.append('file', $('#uploadFile')[0].files[0]);

    $("#UpdateMessage5").html("Uploading file ....");
    $("#UpdateMessage5").css("background","url(../include/images/loaderIcon.gif) no-repeat right");

    myformData.append('mode', 'fileUpload');
    myformData.append('myid', $('#myid').val());
    myformData.append('type', $('#fileType').val());
    //formData.append('myfile', file, file.name); 

    $.ajax({
        url: 'include/fetch.php',
        method: 'post',
        processData: false,
        contentType: false,
        cache: false,
        data: myformData,
        enctype: 'multipart/form-data',
        success: function(response){
            $("#UpdateMessage5").html(response); //.delay(2000).hide(1); 
            $("#UpdateMessage5").css("background","");

            console.log("file successfully submitted");
        },error: function(){
            console.log("not okay");
        }
    });
});

це запускає форму через jquery validate ... if (! fileupload.valid ()) {return false; }
Майк Волмар

7

Використовувати чистий js простіше

async function saveFile(inp) 
{
    let formData = new FormData();           
    formData.append("file", inp.files[0]);
    await fetch('/upload/somedata', {method: "POST", body: formData});    
    alert('success');
}
<input type="file" onchange="saveFile(this)" >

  • На стороні сервера ви можете прочитати назву оригіналу файлу (та іншу інформацію), яка автоматично включається для запиту.
  • НЕ потрібно встановлювати заголовок "Вміст-Тип" на "багаточастинні / форми-дані", браузер встановить його автоматично
  • Це рішення має працювати у всіх основних браузерах.

Ось більш розроблений фрагмент з обробкою помилок та додатковою відправленням json


6

Так, ви можете, просто використовуйте javascript, щоб отримати файл, переконуючись, що ви прочитали файл як URL-адресу даних. Проаналізуйте матеріал перед base64, щоб фактично отримати кодовані базові 64 дані, а потім, якщо ви використовуєте php чи справді будь-яку мову зворотнього кінця, ви можете розшифрувати базові дані 64 та зберегти у файл, як показано нижче

Javascript:
var reader = new FileReader();
reader.onloadend = function ()
{
  dataToBeSent = reader.result.split("base64,")[1];
  $.post(url, {data:dataToBeSent});
}
reader.readAsDataURL(this.files[0]);


PHP:
    file_put_contents('my.pdf', base64_decode($_POST["data"]));

Звичайно, ви, ймовірно, захочете зробити деяку перевірку, як-от перевірити тип файлу, з яким ви маєте справу, та подібні речі, але це ідея.


file_put_contents ($ fname, file_get_contents ($ _ POST ['дані'])); file_get_contents займається розшифровкою та даними: // header
Нанде

5
<html>
    <head>
        <title>Ajax file upload</title>
        <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
        <script>
            $(document).ready(function (e) {
            $("#uploadimage").on('submit', (function(e) {
            e.preventDefault();
                    $.ajax({
                    url: "upload.php", // Url to which the request is send
                            type: "POST", // Type of request to be send, called as method
                            data: new FormData(this), // Data sent to server, a set of key/value pairs (i.e. form fields and values)
                            contentType: false, // The content type used when sending data to the server.
                            cache: false, // To unable request pages to be cached
                            processData:false, // To send DOMDocument or non processed data file it is set to false
                            success: function(data)   // A function to be called if request succeeds
                            {
                            alert(data);
                            }
                    });
            }));
        </script>
    </head>
    <body>
        <div class="main">
            <h1>Ajax Image Upload</h1><br/>
            <hr>
            <form id="uploadimage" action="" method="post" enctype="multipart/form-data">
                <div id="image_preview"><img id="previewing" src="noimage.png" /></div>
                <hr id="line">
                <div id="selectImage">
                    <label>Select Your Image</label><br/>
                    <input type="file" name="file" id="file" required />
                    <input type="submit" value="Upload" class="submit" />
                </div>
            </form>
        </div>
    </body>
</html>

4

Ви можете використовувати метод ajaxSubmit як слід :), коли ви вибираєте файл, який потрібно завантажити на сервер, форму подайте на сервер :)

$(document).ready(function () {
    var options = {
    target: '#output',   // target element(s) to be updated with server response
    timeout: 30000,
    error: function (jqXHR, textStatus) {
            $('#output').html('have any error');
            return false;
        }
    },
    success: afterSuccess,  // post-submit callback
    resetForm: true
            // reset the form after successful submit
};

$('#idOfInputFile').on('change', function () {
    $('#idOfForm').ajaxSubmit(options);
    // always return false to prevent standard browser submit and page navigation
    return false;
});
});

2
Я вважаю, ви говорите про плагін форми jquery . Тут дійсно найкращий варіант, крім відсутності деталей у вашій відповіді.
fotanus

@fotanus ти маєш рацію! цей сценарій повинен використовувати плагін форми jquery, щоб подати метод використання ajaxSubmit, який визначається у плагіні форми jquery
Quy Le

4

щоб завантажити файл, поданий користувачем як частину форми за допомогою jquery, будь ласка, дотримуйтесь наведеного нижче коду:

var formData = new FormData();
formData.append("userfile", fileInputElement.files[0]);

Потім відправте об’єкт даних форми на сервер.

Ми також можемо додати файл або Blob безпосередньо до об'єкта FormData.

data.append("myfile", myBlob, "filename.txt");

3

Якщо ви хочете завантажити файл за допомогою AJAX, ось код, який ви можете використовувати для завантаження файлу.

$(document).ready(function() {
    var options = { 
                beforeSubmit:  showRequest,
        success:       showResponse,
        dataType: 'json' 
        }; 
    $('body').delegate('#image','change', function(){
        $('#upload').ajaxForm(options).submit();        
    }); 
});     
function showRequest(formData, jqForm, options) { 
    $("#validation-errors").hide().empty();
    $("#output").css('display','none');
    return true; 
} 
function showResponse(response, statusText, xhr, $form)  { 
    if(response.success == false)
    {
        var arr = response.errors;
        $.each(arr, function(index, value)
        {
            if (value.length != 0)
            {
                $("#validation-errors").append('<div class="alert alert-error"><strong>'+ value +'</strong><div>');
            }
        });
        $("#validation-errors").show();
    } else {
         $("#output").html("<img src='"+response.file+"' />");
         $("#output").css('display','block');
    }
}

Ось HTML для завантаження файлу

<form class="form-horizontal" id="upload" enctype="multipart/form-data" method="post" action="upload/image'" autocomplete="off">
    <input type="file" name="image" id="image" /> 
</form>

3

Щоб отримати всі введення форми, включаючи тип = "файл", вам потрібно використовувати об'єкт FormData . Ви зможете побачити вміст formData у відладчику -> мережа -> Заголовки після того, як ви подасте форму.

var url = "YOUR_URL";

var form = $('#YOUR_FORM_ID')[0];
var formData = new FormData(form);


$.ajax(url, {
    method: 'post',
    processData: false,
    contentType: false,
    data: formData
}).done(function(data){
    if (data.success){ 
        alert("Files uploaded");
    } else {
        alert("Error while uploading the files");
    }
}).fail(function(data){
    console.log(data);
    alert("Error while uploading the files");
});

2
var dataform = new FormData($("#myform")[0]);
//console.log(dataform);
$.ajax({
    url: 'url',
    type: 'POST',
    data: dataform,
    async: false,
    success: function(res) {
        response data;
    },
    cache: false,
    contentType: false,
    processData: false
});

5
ви можете вдосконалити свою відповідь, додавши деякі деталі
SR

1

Ось ідея, про яку я думав:

Have an iframe on page and have a referencer.

Майте форму, в якій ви переміщуєте елемент INPUT: File.

Form:  A processing page AND a target of the FRAME.

Результат буде розміщено у кадрі, і тоді ви можете просто надіслати отримані дані на рівні до потрібного тегу зображень із чимось на зразок:

data:image/png;base64,asdfasdfasdfasdfa

і сторінка завантажується.

Я вважаю, що це працює для мене, і залежно від того, ви можете зробити щось на зразок:

.aftersubmit(function(){
    stopPropigation()// or some other code which would prevent a refresh.
});

Я не бачу, як це покращує будь-яку іншу відповідь, дану раніше. Також це розповсюдження, а не розповсюдження! ;)
JDuarteDJ
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.