jQuery Ajax Upload de Fichier

puis-je utiliser le code jQuery suivant pour effectuer le téléchargement de fichier en utilisant la méthode post d'une requête Ajax ?

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

si c'est possible, dois-je remplir la partie "données"? Est-ce la bonne manière? Je ne publier le fichier sur le serveur.

j'ai été Googler autour, mais ce que j'ai trouvé un plugin alors que dans mon plan, je ne veux pas l'utiliser. Au moins pour le moment.

627
demandé sur Taryn 2010-02-23 19:58:24

21 réponses

le téléchargement de fichier est pas possible via ajax. Vous pouvez télécharger le fichier, sans rafraîchir la page en utilisant IFrame. vous pouvez vérifier plus de détails ici

mise à jour:

avec XHR2, le téléchargement de fichier par AJAX est supporté. Par exemple: par FormData objet, mais malheureusement il n'est pas pris en charge par tous/anciens navigateurs.

FormData le soutien commence à partir des versions suivantes de navigateurs de bureau. IE 10+, Firefox 4.0+, Chrome 7+, Safari 5+, Opera 12 +

pour plus de détails, voir lien MDN

531
répondu Adeel 2014-04-30 04:17:55

Iframes n'est plus nécessaire pour télécharger des fichiers via ajax. J'ai récemment fait par moi-même. Regardez ces pages:

utilisant des téléchargements de fichiers HTML5 avec AJAX et jQuery

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

mis à jour la réponse et nettoyé. Utilisez la fonction getSize pour vérifier la taille ou utilisez la fonction getType pour vérifier les types. Ajouter progressbar code html et 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 + "%");
};

comment utiliser 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();
});

Progressbar code html

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

Progressbar css code

#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;
}
261
répondu Ziinloader 2018-04-23 15:01:53

Ajax post et de téléchargement de fichiers est possible. J'utilise la fonction jQuery $.ajax pour charger mes fichiers. J'ai essayé d'utiliser L'objet XHR mais je n'ai pas pu obtenir de résultats du côté serveur avec 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);
       }
});

comme vous pouvez le voir, vous devez créer un objet FormData, vide ou à partir de (sérialisé? - $('#yourForm').serialize()) formulaire existant, puis joignez le fichier d'entrée.

Voici plus d'informations: - comment télécharger un fichier en utilisant jQuery.ajax et FormData - Téléchargement de fichiers via jQuery, objet FormData est fournie et pas de nom de fichier, requête GET

pour le processus PHP vous pouvez utiliser quelque chose comme ceci:

//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
            ));
}
147
répondu pedrozopayares 2017-05-23 12:02:47

Simple Formulaire D'Upload

 <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>
80
répondu vickisys 2018-08-06 10:44:10

je suis assez en retard pour ça, mais je cherchais une solution de téléchargement d'image basée sur ajax et la réponse que je cherchais était un peu éparpillée dans ce post. La solution que j'ai choisie concernait L'objet FormData. J'ai assemblé une forme basique du code que j'ai assemblé. Vous pouvez voir qu'il montre comment ajouter un champ personnalisé au formulaire avec fd.ajoute () ainsi que la façon de traiter les données de réponse lorsque la requête ajax est faite.

Téléchargement 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>

Dans le cas où vous travaillez avec php voici une façon de gérer l'upload qui inclut l'utilisation de deux champs personnalisés démontré dans le html ci-dessus.

Upload.151930920 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";
}
?>
59
répondu lee8oi 2016-04-17 15:05:12

un téléchargement AJAX est en effet possible avec XMLHttpRequest(). Pas les iframes nécessaire. La progression du téléchargement peut être affichée.

Pour plus de détails voir: Réponse https://stackoverflow.com/a/4943774/873282 à la question jQuery Avancement du Téléchargement et de l'AJAX upload de fichier .

30
répondu koppor 2017-05-23 12:18:25

Dans le cas où vous voulez le faire comme ça:

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

que

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

pourrait être votre solution.

13
répondu lgersman 2013-01-04 08:59:00
  • utilisez une iframe cachée et définissez la cible de votre formulaire au nom de cette iframe. De cette façon, lorsque le formulaire est soumis, seulement l'iframe sera actualisé.
  • avoir un gestionnaire d'événement enregistré pour l'événement de charge de l'iframe pour analyser la réponse.

plus de détails sur mon billet de blog: http://blog.manki.in/2011/08/ajax-fie-upload.html .

12
répondu Manki 2011-08-17 00:11:23
$("#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;    
});

edit: Remarque contentype et traiter des données Vous pouvez simplement utiliser ceci pour télécharger des fichiers via Ajax...... soumettre entrée ne peut pas être à l'extérieur de la forme de l'élément :)

9
répondu Gvice 2013-10-20 17:47:48

j'ai mis en œuvre un fichier Multiple select avec aperçu instantané et télécharger après avoir retiré les fichiers indésirables de l'aperçu via ajax.

une documentation détaillée peut être trouvée ici: http://anasthecoder.blogspot.ae/2014/12/multi-file-select-preview-without.html

Démo: 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;
}
6
répondu Ima 2015-08-10 07:14:06

j'ai manipulé ceux-ci dans un code simple. Vous pouvez télécharger une démo de travail de ici

pour votre affaire, c'est très possible. Je vais vous montrer étape par étape comment vous pouvez télécharger un fichier sur le serveur en utilisant AJAX jquery.

tout d'abord, créons un fichier HTML pour ajouter l'élément de fichier de formulaire suivant comme montré ci-dessous.

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

créer ensuite un jquery.fichier js et ajouter le code suivant pour gérer notre soumission de fichier au serveur

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

voilà, c'est fini . voir plus

5
répondu Daniel Nyamasyo 2016-07-19 05:36:11

L'utilisation de FormData est la voie à suivre, comme l'indiquent de nombreuses réponses. voici un peu de code qui fonctionne très bien pour cet usage. Je suis également d'accord avec le commentaire des blocs ajax de nidification pour compléter les circonstances complexes. En incluant e.PreventDefault(); dans mon expérience, rend le code plus de la croix-navigateur compatible.

    $('#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");
        }
    });
});
5
répondu Mike Volmar 2018-05-24 01:56:02

Oui, vous pouvez, il suffit d'utiliser javascript pour obtenir le fichier, en vous assurant de lire le fichier comme une URL de données. Analyser les choses avant base64 pour obtenir réellement les données encodées de base 64 et puis si vous utilisez php ou vraiment n'importe quel langage back end, vous pouvez décoder les données de base 64 et enregistrer dans un fichier comme montré ci-dessous

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

bien sûr, vous voudrez probablement faire un peu de validation comme Vérifier le type de fichier avec lequel vous traitez et des trucs comme ça, mais c'est idée.

4
répondu Piacenti 2014-10-12 05:57:19
<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
répondu Nikit Barochiya 2018-02-14 16:01:33

Vous pouvez utiliser la méthode ajaxSubmit comme suit :) lorsque vous sélectionnez un fichier qui ont besoin de télécharger vers le serveur, formulaire de soumettre au serveur :)

$(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;
});
});
3
répondu Quy Le 2014-02-16 03:55:12

pour télécharger un fichier qui est soumis par l'utilisateur comme une partie du formulaire en utilisant jquery s'il vous plaît suivre le code ci-dessous:

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

envoie ensuite l'objet form data au serveur.

nous pouvons aussi ajouter un fichier ou un Blob directement à L'objet FormData.

data.append("myfile", myBlob, "filename.txt");
3
répondu VISHNU Radhakrishnan 2016-08-09 09:15:03

si vous voulez télécharger un fichier en utilisant AJAX voici le code que vous pouvez utiliser pour le téléchargement de fichier.

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

voici le HTML pour télécharger le fichier

<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>
2
répondu Nikunj K. 2016-08-02 10:55:07

Pour obtenir toutes vos entrées de formulaire, y compris le type="file" , vous devez utiliser objet FormData . vous pourrez voir le contenu de formData dans le débogueur -> réseau ->en-têtes après avoir soumis le formulaire.

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
répondu David 2016-10-20 06:38:42

Ajax ne supporte pas les téléchargements de fichiers, vous devriez utiliser iframe à la place

1
répondu antyrat 2010-02-23 17:02:36
                 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
                    });
1
répondu Jayesh Paunikar 2017-06-09 10:48:23

Voici une idée à laquelle je pensais:

Have an iframe on page and have a referencer.

ont un formulaire dans lequel vous déplacez L'élément INPUT:File.

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

le résultat sera affiché sur le cadre, et ensuite vous pouvez simplement envoyer les données récupérées à un niveau supérieur à la balise d'image que vous voulez avec quelque chose comme:

data:image/png;base64,asdfasdfasdfasdfa

et la page se charge.

je crois que cela fonctionne pour moi, et en fonction de vous pourrait être en mesure de faire quelque chose comme:

.aftersubmit(function(){
    stopPropigation()// or some other code which would prevent a refresh.
});
0
répondu Fallenreaper 2013-10-31 13:03:39