jQuery Ajax File Upload


755

Posso usare il seguente codice jQuery per eseguire il caricamento di file usando il metodo POST di una richiesta Ajax?

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

Se è possibile, devo riempire la dataparte? È il modo corretto? POSTO solo il file sul lato server.

Ho cercato su Google, ma quello che ho trovato era un plugin mentre nel mio piano non voglio usarlo. Almeno per il momento.


Ajax non supporta i caricamenti di file, dovresti invece usare iframe
antyrat


Risposte:


596

Il caricamento dei file non è possibile tramite AJAX.
Puoi caricare il file senza aggiornare la pagina utilizzando IFrame.
Puoi controllare ulteriori dettagli qui .


AGGIORNARE

Con XHR2 è supportato il caricamento di file tramite AJAX. Ad esempio tramite FormDataoggetto, ma sfortunatamente non è supportato da tutti i browser / vecchi.

FormData il supporto inizia dalle seguenti versioni di browser desktop.

  • IE 10+
  • Firefox 4.0+
  • Chrome 7+
  • Safari 5+
  • Opera 12+

Per maggiori dettagli, consultare il link MDN .


41
Ecco un elenco dei browser specifici che non sono supportati: caniuse.com/#search=FormData Inoltre non ho ancora testato questo, ma ecco un polyfill per FormData gist.github.com/3120320
Ryan White

152
In particolare, IE <10 no, per quelli troppo pigri per leggere il link.
Kevin,

22
@Synexis no, non dobbiamo più aspettare così tanto perché tutti gli IE hanno solo una quota di mercato mondiale del 22% e il 27% negli Stati Uniti e in rapida discesa. È probabile che siano persone con più di 70 anni. Quindi piuttosto che IE dettare ciò che gli sviluppatori devono fare, IE dovrà o modellarsi o uscire dalla corsa.
Ha disegnato Calder il

30
@DrewCalder La maggior parte degli utenti IE sono impiegati che non hanno la scelta del browser da utilizzare a causa delle politiche aziendali. Non credo che l'età abbia molto a che fare con questo. Suppongo che la maggior parte delle persone> 70 ottenga invece la propria prole per installare Chrome o FF :)
Nicolas Connault,

3
Questo link mi ha davvero aiutato a capire il minimo indispensabile. Non ho dovuto usare una richiesta xhr. Se usi ajax assicurati di impostare enctypesu "form/multipart"!
Luminoso

316

Gli Iframe non sono più necessari per il caricamento di file tramite Ajax. L'ho fatto di recente da solo. Dai un'occhiata a queste pagine:

Utilizzo dei caricamenti di file HTML5 con AJAX e jQuery

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

Aggiornata la risposta e ripulita. Utilizzare la funzione getSize per controllare le dimensioni o utilizzare la funzione getType per verificare i tipi. Aggiunto codice HTML e CSS della barra di avanzamento.

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 + "%");
};

Come utilizzare la classe 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();
});

Codice HTML Progressbar

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

Codice css Progressbar

#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
Puoi più o meno copiare il codice immediatamente e usarlo. Basta cambiare alcuni nomi ID e nomi di classe. Ogni personalizzazione è per conto tuo.
Ziinloader

4
Si noti che myXhr sembra essere globale, nonché nome, dimensione e tipo. Inoltre è meglio usare "beforeSend" per aumentare l'oggetto XMLHttpRequest già creato piuttosto che usare "xhr" per crearne uno e modificarlo.
risveglia il

8
Non penso che possiamo usarlo come è @Ziinloader. Stai usando un metodo locale che non è incluso: writer(catchFile). Che cosa è writer()?
tandrewnichols,

4
Cosa succede se i dati contengono anche alcuni campi insieme al file da caricare?
raju,

2
@Ziinloader Questo è un esempio tremendamente utile in cui vedo che sei tornato e mantenuto più volte. Davvero una risposta che vale molto più di quella che posso dare.
Regolare Joe,

191

È possibile pubblicare e caricare file Ajax. Sto usando la jQuery $.ajaxfunzione per caricare i miei file. Ho provato a usare l'oggetto XHR ma non sono riuscito a ottenere risultati sul lato server con 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);
       }
});

Come puoi vedere, devi creare un oggetto FormData, vuoto o da (serializzato? - $('#yourForm').serialize())modulo esistente, quindi allegare il file di input.

Ecco ulteriori informazioni: - Come caricare un file utilizzando jQuery.ajax e FormData - Caricamento dei file tramite jQuery, viene fornito l'oggetto FormData e nessun nome file, richiesta GET

Per il processo PHP puoi usare qualcosa del genere:

//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
Quale libreria jquery devo fare riferimento per eseguire questo codice?
Rayden Black il

La risposta è stata scritta nel 2014. La versione di JQuery era la 1.10. Non ho provato con versioni più recenti.
pedrozopayares,

5
formData.append('file', $('#file')[0].files[0]);ritorna undefinede console.log(formData) non ha altro che_proto_
Yakob Ubaidi,

1
Non supportato da IE 9, nel caso in cui alcuni siano bloccati nello stesso inferno di I
CountMurphy,

3
Ho capito che funziona ... Pizzicami, sono in paradiso per il caricamento di file 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

Modulo di caricamento semplice

 <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>


signore quali sono i js che sono stati usati in questo esempio c'è uno specifico plugin jquery per questo..ho una domanda che mi è stata rivolta qui puoi per favore controlla la mia domanda .. voglio caricare più file o immagini in quel progetto qui è il link stackoverflow.com/questions/28644200/…
Brownman Revival

19
$ (this) [0] is this
machineaddict

2
Qual è il parametro sul server per il file pubblicato? Potete per favore pubblicare la parte del server.
FrenkyB,

@FrenkyB e altri - i file sul server (in PHP) non sono memorizzati nella variabile $ _POST - sono memorizzati nella variabile $ _FILES. In questo caso, accederesti con $ _FILES ["csv"] perché "csv" è l'attributo name del tag di input.
dev_masta,

68

Sono in ritardo per questo, ma stavo cercando una soluzione di caricamento delle immagini basata su Ajax e la risposta che stavo cercando era un po 'sparsa in questo post. La soluzione su cui ho optato riguardava l'oggetto FormData. Ho assemblato una forma base del codice che ho messo insieme. Puoi vedere come viene illustrato come aggiungere un campo personalizzato al modulo con fd.append () e come gestire i dati di risposta quando viene eseguita la richiesta ajax.

Carica 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>

Nel caso in cui tu stia lavorando con php ecco un modo per gestire il caricamento che include l'utilizzo di entrambi i campi personalizzati dimostrati nel precedente 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";
}
?>

sto capendo Cross origin requests are only supported for protocol schemes: http, data, chrome, chrome-extension, https,perché è così signore copio incollare il codice così com'è
Brownman Revival

2
@HogRider: se invii un messaggio di errore a Google, questo è il primo risultato: stackoverflow.com/questions/10752055/… Stai accedendo alle tue pagine Web localmente file://, anziché utilizzare un server Web? A parte questo, non è buona prassi semplicemente copiare e incollare il codice alla cieca senza prima capirlo. Ti consiglierei di leggere il codice riga per riga per capire cosa sta succedendo prima di utilizzare il codice.
Colincameron,

@colincameron ti ringrazio per aver chiarito alcune cose che ho passato attraverso la riga per riga e non capisco davvero molto, quindi ho posto la domanda in modo che qualcuno potesse chiarire i miei dubbi. Sto usando local a proposito di xampp per essere esatti. Posso fare una domanda che forse puoi chiarire?
Brownman Revival

@Brownman Revival: so che è troppo tardi per la risposta. Hai ricevuto un errore di origine incrociata perché hai aperto il file html come file piuttosto che eseguirlo dal server.
Adarsh ​​Mohan,

@AdarshMohan appreaciate la risposta come mi consigliate lo faccio per farlo bene?
Brownman Revival,

31

Un upload AJAX è infatti possibile con XMLHttpRequest(). Nessun iframe necessario. È possibile visualizzare l'avanzamento del caricamento.

Per i dettagli, consultare: Rispondere a https://stackoverflow.com/a/4943774/873282 per porre domande su jQuery Progress Progress e sul caricamento del file AJAX .


24
Purtroppo IE <10 non supporta questo.
Sasha Chedygov,

1
Quando desideri semplicemente fare riferimento a un'altra pagina come risposta, puoi votare per chiudere come duplicato o lasciare un commento sotto la domanda. Questo post non è una risposta. Un post di questo tipo sembra un tentativo di coltivare un rappresentante.
Mickmackusa,

18

Ecco come ho ottenuto questo lavoro:

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
Ciò che mi ha aiutato di più in questo senso è stato quello $('#file')[0].files[0]che è una sorta di strana soluzione JS senza richiedere una vera e propria<form>
ffgpga08

Questa è la soluzione completa, aiuta anche il bit PHP.
cdsaenz,

14

Nel caso tu voglia farlo in questo modo:

$.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');                    
});

di

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

potrebbe essere la tua soluzione.


Dove si trova il metodo di caricamento in $ object, il collegamento sopra non esiste
cool del


2
Grazie per aver pubblicato la tua risposta! Assicurati di leggere attentamente le FAQ sull'autopromozione . Si noti inoltre che è necessario pubblicare un disclaimer ogni volta che si collega al proprio sito / prodotto.
Andrew Barber,

13
  • Usa un iframe nascosto e imposta la destinazione del tuo modulo sul nome dell'iframe. In questo modo, quando il modulo viene inviato, verrà aggiornato solo l'iframe.
  • Far registrare un gestore eventi per l'evento load di iframe per analizzare la risposta.

Maggiori dettagli sul mio post sul blog: http://blog.manki.in/2011/08/ajax-fie-upload.html .


Evita iframe ove possibile
Bhargav Nanekalva,

@BhargavNanekalva qual è la tua preoccupazione?
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;    
});

modifica: nota il tipo di contenuto e i dati di processo Puoi semplicemente usarlo per caricare file tramite Ajax ...... l'input non può essere esterno all'elemento del modulo :)


3
Utilizzando questo metodo, è possibile inviare un modulo ma non con i campi di tipo "file". Questa domanda riguarda specificamente il caricamento di file.
Jomy John,

11

Aggiornamento 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
In che modo questo migliora una delle risposte già fornite? Anche questa risposta menziona un file views.py che è Django e non ha nulla a che fare con la domanda.
Dirkgroten,

6
Poiché il problema si manifesta in modo comparabile durante l'utilizzo di Django e se si utilizza Django, non c'è molta direzione qui per quanto riguarda la risoluzione. Ho pensato di offrire assistenza proattiva nel caso in cui qualcuno arrivasse qui come ho fatto in futuro. Hai una giornata difficile?
Jay,

9

Usa FormData. Funziona davvero bene :-) ...

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);
    }
});

questo è ciò: ('user', $ ('# user'). val ());
rahim.nagori,

la casella di testo con id = "user" è allegata al modulo @ rahim.nagori
Alp Altunel

1
Un approccio più diretto: var jform = new FormData ($ ('form'). Get (0));
André Morales

bello, grazie, proverò la prossima volta che userò FormData
delboy1978uk

7

Ho implementato una selezione di più file con anteprima istantanea e caricamento dopo aver rimosso i file indesiderati dall'anteprima tramite Ajax.

La documentazione dettagliata è disponibile qui: http://anasthecoder.blogspot.ae/2014/12/multi-file-select-preview-without.html

Demo: 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: vedi il post sul blog per le spiegazioni: goo.gl/umgFFy . Se hai ancora qualche domanda, torna da me Grazie
Ima

7

Ho gestito questi in un semplice codice. Puoi scaricare una demo funzionante da qui

Per il tuo caso, questi sono molto possibili. Ti illustrerò passo per passo come puoi caricare un file sul server usando AJAX jquery.

Per prima cosa creiamo un file HTML per aggiungere il seguente elemento del file modulo come mostrato di seguito.

<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>

In secondo luogo, crea un file jquery.js e aggiungi il seguente codice per gestire l'invio dei nostri file al server

    $("#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");
            }
         });
      });
    });

Ecco fatto. Vedi di più


7

L'uso di FormData è la strada da percorrere come indicato da molte risposte. ecco un po 'di codice che funziona benissimo per questo scopo. Concordo anche con il commento sull'annidamento dei blocchi Ajax per completare circostanze complesse. Includendo e.PreventDefault (); nella mia esperienza, rende il codice più compatibile con più browser.

    $('#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");
        }
    });
});

questo esegue il modulo tramite jquery validate ... if (! fileupload.valid ()) {return false; }
Mike Volmar,

7

Usare pure js è più facile

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)" >

  • Nel lato server è possibile leggere il nome del file originale (e altre informazioni) che viene automaticamente incluso per la richiesta.
  • NON è necessario impostare l'intestazione "Tipo di contenuto" sul browser "multipart / form-data" per impostarlo automaticamente
  • Queste soluzioni dovrebbero funzionare su tutti i principali browser.

Ecco uno snippet più sviluppato con gestione degli errori e invio json aggiuntivo


6

Sì, puoi, basta usare javascript per ottenere il file, assicurandoti di leggere il file come un URL di dati. Analizza il materiale prima di base64 per ottenere effettivamente i dati codificati base 64 e quindi se stai usando php o qualsiasi altra lingua back-end puoi decodificare i dati base 64 e salvarli in un file come mostrato di seguito

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"]));

Ovviamente probabilmente vorrai fare qualche validazione come controllare con quale tipo di file hai a che fare e cose del genere ma questa è l'idea.


file_put_contents ($ fname, file_get_contents ($ _ POST ['data'])); file_get_contents si occupa della decodifica e dei dati: // header
Nande

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

È possibile utilizzare il metodo ajaxSubmit come segue :) quando si seleziona un file che deve essere caricato sul server, il modulo deve essere inviato al server :)

$(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
Credo che tu stia parlando di jquery form plugin. È davvero l'opzione migliore qui, a parte la mancanza di dettagli nella tua risposta.
fotanus,

@fotanus hai ragione! tale script deve utilizzare il plug-in del modulo jquery per inviare il metodo di utilizzo ajaxSubmit che definisce nel plug
Quy Le

4

per caricare un file inviato dall'utente come parte del modulo utilizzando jquery, seguire il codice seguente:

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

Quindi inviare l'oggetto dati del modulo al server.

È inoltre possibile aggiungere un file o un BLOB direttamente all'oggetto FormData.

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

3

Se desideri caricare un file utilizzando AJAX, ecco il codice che puoi utilizzare per il caricamento dei file.

$(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');
    }
}

Ecco l'HTML per caricare il file

<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

Per ottenere tutti gli input del modulo, incluso il tipo = "file", è necessario utilizzare l'oggetto FormData . sarai in grado di vedere il contenuto formData nel debugger -> rete -> Intestazioni dopo aver inviato il modulo.

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
puoi migliorare la tua risposta aggiungendo alcuni dettagli
SR

1

Ecco un'idea a cui stavo pensando:

Have an iframe on page and have a referencer.

Avere una forma in cui si sposta l'elemento INPUT: File in.

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

Il risultato verrà pubblicato nel frame e quindi puoi semplicemente inviare i dati recuperati di un livello al tag immagine che desideri con qualcosa del tipo:

data:image/png;base64,asdfasdfasdfasdfa

e la pagina viene caricata.

Credo che funzioni per me e, a seconda del caso, potresti essere in grado di fare qualcosa del tipo:

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

Non vedo come questo migliora qualsiasi altra risposta data prima. Inoltre è Propagation non Propigation! ;)
JDuarteDJ,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.