Téléchargement de fichier sans formulaire

94

Sans utiliser aucun formulaire, puis-je simplement envoyer un fichier / fichiers de <input type="file">vers 'upload.php' en utilisant la méthode POST en utilisant jQuery. La balise d'entrée ne se trouve dans aucune balise de formulaire. Il se tient individuellement. Je ne veux donc pas utiliser de plugins jQuery comme 'ajaxForm' ou 'ajaxSubmit'.

Elo Peri
la source
1
Essayez ceci: uploadify.com mais utilisez la version flash. Allez, lancez votre pierre. Je ne sais pas si la version HTML5 fonctionne sans formulaire. Probablement, mais je ne suis pas sûr.
Ismael Miguel
1
Arrr .... Je veux dire que cela devrait fonctionner en HTML 5. Mais vous allez être en proie à des problèmes de compatibilité de plate-forme et des navigateurs de plus de quelques années. Quel mal y a-t-il à créer une forme ou à générer dynamiquement une forme à partir du néant?
Yitzhak

Réponses:

93

Vous pouvez utiliser FormData pour soumettre vos données par une requête POST. Voici un exemple simple:

var myFormData = new FormData();
myFormData.append('pictureFile', pictureInput.files[0]);

$.ajax({
  url: 'upload.php',
  type: 'POST',
  processData: false, // important
  contentType: false, // important
  dataType : 'json',
  data: myFormData
});

Vous n'avez pas besoin d'utiliser un formulaire pour faire une requête ajax, tant que vous connaissez le paramètre de votre requête (comme les données d'url, de méthode et de paramètres).

Omid Monshizadeh
la source
À mon humble avis, c'est la meilleure solution, mais un autre choix consiste à utiliser un <iframe à l'intérieur, vous pouvez faire une publication régulière
John Smith
Oui c'est vrai. Les anciens navigateurs ne prennent pas en charge FormData et ajax pour télécharger des fichiers et la solution si vous souhaitez utiliser iframe comme solution de secours sur ces navigateurs.
Omid Monshizadeh
7
N'oubliez pas d'ajouter processData: falseet contentType: falseà l'objet de paramètres, sinon vous recevrez Uncaught TypeError: Illegal invocation
jsmiff
2
Mec, tu m'as sauvé la vie !! : D Merci @monshi et @ jsmiff. (Le SOF interdit plusieurs utilisateurs dans le même commentaire).
Silvio Delgado
4
qu'est-ce que pictureInput?
developersaumya
30

Toutes les réponses ici utilisent toujours l' API FormData . C'est comme un "multipart/form-data"téléchargement sans formulaire. Vous pouvez également télécharger le fichier directement en tant que contenu dans le corps de la POSTdemande en utilisant xmlHttpRequestcomme ceci:

var xmlHttpRequest = new XMLHttpRequest();

var file = ...file handle...
var fileName = ...file name...
var target = ...target...
var mimeType = ...mime type...

xmlHttpRequest.open('POST', target, true);
xmlHttpRequest.setRequestHeader('Content-Type', mimeType);
xmlHttpRequest.setRequestHeader('Content-Disposition', 'attachment; filename="' + fileName + '"');
xmlHttpRequest.send(file);

Content-Typeet les en- Content-Dispositiontêtes sont utilisés pour expliquer ce que nous envoyons (type mime et nom de fichier).

J'ai posté une réponse similaire également ici .

Se flétrir
la source
1
C'est une excellente réponse. Il évite complètement l'utilisation des données de formulaire. Je peux ajouter un peu plus à l'utilisation de xmlHttpRequest. Un XMLHttpRequest permet d'effectuer des opérations asynchrones, qui ne bloquent pas le client (page UI). Lors de l'utilisation d'un formulaire HTML, le client (page UI) est bloqué pendant l'exécution de l'opération.
Harry
Et quoi fetch()?
Vitaly Zdanevich le
@VitalyZdanevich ne sais pas ce que tu veux dire par là?
Flétrissement le
13

Sur la base de ce didacticiel , voici une façon très basique de le faire:

$('your_trigger_element_selector').on('click', function(){    
    var data = new FormData();
    data.append('input_file_name', $('your_file_input_selector').prop('files')[0]);
    // append other variables to data if you want: data.append('field_name_x', field_value_x);

    $.ajax({
        type: 'POST',               
        processData: false, // important
        contentType: false, // important
        data: data,
        url: your_ajax_path,
        dataType : 'json',  
        // in PHP you can call and process file in the same way as if it was submitted from a form:
        // $_FILES['input_file_name']
        success: function(jsonData){
            ...
        }
        ...
    }); 
});

N'oubliez pas d'ajouter une gestion des erreurs appropriée

Étonnant
la source
11

Étape 1: Créez une page HTML où placer le code HTML.

Étape 2: Dans le bas de la page de code HTML (pied de page), créez Javascript: et placez le code Jquery dans la balise Script.

Étape 3: Créez un fichier PHP et copiez le code php. après Jquery Code dans l' $.ajaxURL du code, appliquez lequel sur votre nom de fichier PHP.

JS

//$(document).on("change", "#avatar", function() {   // If you want to upload without a submit button 
$(document).on("click", "#upload", function() {
  var file_data = $("#avatar").prop("files")[0]; // Getting the properties of file from file field
  var form_data = new FormData(); // Creating object of FormData class
  form_data.append("file", file_data) // Appending parameter named file with properties of file_field to form_data
  form_data.append("user_id", 123) // Adding extra parameters to form_data
  $.ajax({
    url: "/upload_avatar", // Upload Script
    dataType: 'script',
    cache: false,
    contentType: false,
    processData: false,
    data: form_data, // Setting the data attribute of ajax with file_data
    type: 'post',
    success: function(data) {
      // Do something after Ajax completes 
    }
  });
});

HTML

<input id="avatar" type="file" name="avatar" />
<button id="upload" value="Upload" />

Php

print_r($_FILES);
print_r($_POST);
Hadiyal Rakesh
la source
1
S'il vous plaît, ajoutez quelques commentaires / description pour votre code
kvorobiev
manquant un ,aprèstype: 'post'
Rust
1
Fait ma journée :) Merci
shekhardtu
pouvez-vous télécharger un fichier dans un tmprépertoire jusqu'à ce que le formulaire entier soit soumis? (disons que c'était un multi-forme)?
thesayhey
Comment vais-je faire référence à ces variables de formulaire dans le code java
Bhaskara Arani
1

Essayez cette puglin simpleUpload , aucune forme de besoin

Html:

<input type="file" name="arquivo" id="simpleUpload" multiple >
<button type="button" id="enviar">Enviar</button>

Javascript:

$('#simpleUpload').simpleUpload({
  url: 'upload.php',
  trigger: '#enviar',
  success: function(data){
    alert('Envio com sucesso');

  }
});
Rodrigo Azevedo
la source
1

Désolé d'être ce type, mais AngularJS offre une solution simple et élégante.

Voici le code que j'utilise:

ngApp.controller('ngController', ['$upload',
function($upload) {

  $scope.Upload = function($files, index) {
    for (var i = 0; i < $files.length; i++) {
      var file = $files[i];
      $scope.upload = $upload.upload({
        file: file,
        url: '/File/Upload',
        data: {
          id: 1 //some data you want to send along with the file,
          name: 'ABC' //some data you want to send along with the file,
        },

      }).progress(function(evt) {

      }).success(function(data, status, headers, config) {
          alert('Upload done');
        }
      })
    .error(function(message) {
      alert('Upload failed');
    });
  }
};
}]);
.Hidden {
  display: none
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.0/jquery.min.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>

<div data-ng-controller="ngController">
  <input type="button" value="Browse" onclick="$(this).next().click();" />
  <input type="file" ng-file-select="Upload($files, 1)" class="Hidden" />
</div>

Du côté du serveur, j'ai un contrôleur MVC avec une action qui enregistre les fichiers téléchargés trouvés dans la collection Request.Files et renvoie un JsonResult.

Si vous utilisez AngularJS, essayez ceci, si vous ne le faites pas ... désolé mon pote :-)

Shabi_669
la source
Vote contre le vote car ne fonctionne pas avec la directive $ upload
NicoJuicy