Caricamento di file senza modulo


93

Senza utilizzare alcun modulo, posso semplicemente inviare un file / file da <input type="file">a "upload.php" utilizzando il metodo POST utilizzando jQuery. Il tag di input non è all'interno di alcun tag form. Sta individualmente. Quindi non voglio usare plugin jQuery come 'ajaxForm' o 'ajaxSubmit'.


1
Prova questo: uploadify.com ma usa la versione flash. Dai, lancia la tua roccia. Non sono sicuro che la versione HTML5 funzioni senza un modulo. Probabilmente sì, ma non ne sono sicuro.
Ismael Miguel

1
Arrr ... Voglio dire che dovrebbe funzionare in HTML 5. Ma sarai pieno di problemi di compatibilità della piattaforma e di browser più vecchi di pochi anni. Qual è il danno nel creare una forma, o nel generare dinamicamente una forma dai bassi?
Yitzhak,

Risposte:


93

È possibile utilizzare FormData per inviare i dati tramite una richiesta POST. Qui c'è un semplice esempio:

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

Non è necessario utilizzare un modulo per effettuare una richiesta ajax, purché si conosca l'impostazione della richiesta (come URL, metodo e dati dei parametri).


IMHO questa è la soluzione migliore, tuttavia un'altra scelta è usare un <iframe all'interno puoi fare un post regolare indietro
John Smith

Sì è vero. I vecchi browser non supportano FormData e ajax per caricare i file e la soluzione se usare iframe come fallback su quei browser.
Omid Monshizadeh

7
Non dimenticare di aggiungere processData: falsee contentType: falseall'oggetto impostazioni altrimenti riceverai Uncaught TypeError: Illegal invocation
jsmiff

2
Ragazzi, mi avete salvato la vita !! : D Grazie @monshi e @ jsmiff. (Il SOF non consente più utenti nello stesso commento).
Silvio Delgado

4
che cosa è pictureInput in questo ??
Developersaumya

30

Tutte le risposte qui utilizzano ancora l' API FormData . È come un "multipart/form-data"caricamento senza modulo. Puoi anche caricare il file direttamente come contenuto all'interno del corpo della POSTrichiesta utilizzando in xmlHttpRequestquesto modo:

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-Typee le Content-Dispositionintestazioni vengono utilizzate per spiegare cosa stiamo inviando (tipo MIME e nome file).

Ho postato una risposta simile anche qui .


1
Questa è un'ottima risposta. Evita completamente l'utilizzo dei dati del modulo. Posso aggiungere qualcosa in più all'utilizzo di xmlHttpRequest. Un XMLHttpRequest consente di eseguire operazioni asincrone, che non bloccano il client (pagina UI). Durante l'utilizzo di un modulo HTML, il client (pagina UI) viene bloccato durante l'esecuzione dell'operazione.
Harry

Di cosa fetch()?
Vitaly Zdanevich

@VitalyZdanevich non sei sicuro di cosa intendi con questo?
Wilt

Questo metodo funziona su IE?
Tony Cobb,

13

Sulla base di questo tutorial , ecco un modo molto semplice per farlo:

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

Non dimenticare di aggiungere una corretta gestione degli errori


11

Passaggio 1: crea una pagina HTML in cui posizionare il codice HTML.

Passaggio 2: nella parte inferiore della pagina del codice HTML (piè di pagina) creare Javascript: e inserire il codice Jquery nel tag Script.

Passaggio 3: crea il file PHP e copia il codice php. dopo il codice Jquery nell'URL del $.ajaxcodice, applica quello sul nome del tuo file 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);

1
Per favore, aggiungi qualche commento / descrizione per il tuo codice
kvorobiev

manca un ,dopotype: 'post'
Rust

1
Ha reso la mia giornata :) Grazie
shekhardtu

puoi caricare un file in una tmpdirectory finché non viene inviato l'intero modulo? (diciamo che fosse un multiforme)?
thesayhey

Come riferirò queste variabili del modulo nel codice java
Bhaskara Arani

1

Prova questo puglin simpleUpload , nessun modulo necessario

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

  }
});

1

Ci scusiamo per essere quel ragazzo ma AngularJS offre una soluzione semplice ed elegante.

Ecco il codice che utilizzo:

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>

Sul lato server ho un controller MVC con un'azione che salva i file caricati trovati nella raccolta Request.Files e restituisce un JsonResult.

Se usi AngularJS provalo, se non lo fai ... scusa amico :-)


Downvoted perché non funziona con la direttiva $ upload
NicoJuicy
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.