Datei-Upload ohne Formular

92

Ohne irgendwelche Formulare zu verwenden, kann ich einfach eine Datei / Dateien von <input type="file">'upload.php' mit der POST-Methode mit jQuery senden . Das Eingabe-Tag befindet sich nicht in einem Formular-Tag. Es steht individuell. Daher möchte ich keine jQuery-Plugins wie 'ajaxForm' oder 'ajaxSubmit' verwenden.

Elo Peri
quelle
1
Versuchen Sie Folgendes : uploadify.com, aber verwenden Sie die Flash-Version. Komm schon, wirf deinen Stein. Ich bin nicht sicher, ob die HTML5-Version ohne Formular funktioniert. Wahrscheinlich wird, aber ich bin nicht sicher.
Ismael Miguel
1
Arrr .... Ich möchte sagen, dass es in HTML 5 funktionieren sollte. Aber Sie werden voller Probleme mit der Plattformkompatibilität und Browsern sein, die älter als ein paar Jahre sind. Was schadet es, ein Formular zu erstellen oder ein Formular dynamisch aus den Nether zu generieren?
Yitzhak

Antworten:

92

Sie können FormData verwenden , um Ihre Daten per POST-Anfrage zu übermitteln. Hier ist ein einfaches Beispiel:

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

Sie müssen kein Formular verwenden, um eine Ajax-Anfrage zu stellen, solange Sie Ihre Anforderungseinstellung kennen (wie URL-, Methoden- und Parameterdaten).

Omid Monshizadeh
quelle
IMHO ist dies die beste Lösung, aber eine andere Wahl ist, einen <iframe zu verwenden, in dem Sie einen regulären Post zurück machen können
John Smith
Ja das stimmt. Alte Browser unterstützen FormData und Ajax nicht zum Hochladen von Dateien und die Lösung, wenn Iframe als Fallback für diese Browser verwendet werden soll.
Omid Monshizadeh
7
Vergessen Sie nicht, processData: falseund contentType: falsezum Einstellungsobjekt hinzuzufügen , sonst erhalten Sie Uncaught TypeError: Illegal invocation
jsmiff
2
Leute, du hast mein Leben gerettet !! : D Vielen Dank an @monshi und @ jsmiff (das SOF verbietet mehrere Benutzer im selben Kommentar).
Silvio Delgado
4
Was ist PictureInput in diesem?
Entwickleraumya
30

Alle Antworten hier verwenden weiterhin die FormData-API . Es ist wie ein "multipart/form-data"Upload ohne Formular. Sie können die Datei auch direkt als Inhalt im Hauptteil der POSTAnfrage hochladen, indem Sie xmlHttpRequestFolgendes verwenden:

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-Typeund Content-DispositionHeader werden verwendet, um zu erklären, was wir senden (MIME-Typ und Dateiname).

Ich habe eine ähnliche Antwort auch hier gepostet .

Verwelken
quelle
1
Das ist eine großartige Antwort. Die Verwendung von Formulardaten wird vollständig vermieden. Ich kann der Verwendung von xmlHttpRequest etwas mehr hinzufügen. Mit XMLHttpRequest können asynchrone Vorgänge ausgeführt werden, die den Client nicht blockieren (UI-Seite). Bei Verwendung eines HTML-Formulars wird der Client (UI-Seite) blockiert, während der Vorgang ausgeführt wird.
Harry
Was ist mit fetch()?
Vitaly Zdanevich
@VitalyZdanevich nicht sicher, was du damit meinst?
Wilt
Funktioniert diese Methode im IE?
Tony Cobb
13

Anhand dieses Tutorials finden Sie hier eine sehr grundlegende Möglichkeit, dies zu tun:

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

Vergessen Sie nicht, die richtige Fehlerbehandlung hinzuzufügen

Erstaunlich
quelle
11

Schritt 1: Erstellen Sie eine HTML-Seite, auf der der HTML-Code platziert werden soll.

Schritt 2: Erstellen Sie im unteren Bereich der HTML-Codepage (Fußzeile) Javascript: und fügen Sie den JQuery-Code in das Skript-Tag ein.

Schritt 3: Erstellen Sie eine PHP-Datei und kopieren Sie den PHP-Code. Nach Jquery Code in $.ajaxCode URL wende welchen auf deinen PHP-Dateinamen an.

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
quelle
1
Bitte fügen Sie einige Kommentare / Beschreibung für Ihren Code
kvorobiev
fehlt ein ,Aftertype: 'post'
Rust
1
Machte meinen Tag :) Danke
shekhardtu
Können Sie eine Datei in ein tmpVerzeichnis hochladen, bis das gesamte Formular gesendet wurde? (sagen wir, es war eine Multi-Form)?
Thesayhey
Wie werde ich diese Formularvariablen im Java-Code verweisen
Bhaskara Arani
1

Versuchen Sie dieses puglin simpleUpload , kein Formular erforderlich

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

Tut mir leid, dass ich dieser Typ bin , aber AngularJS bietet eine einfache und elegante Lösung.

Hier ist der Code, den ich benutze:

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>

Auf der Serverseite habe ich einen MVC-Controller mit einer Aktion, die die hochgeladenen Dateien speichert, die in der Request.Files-Auflistung gefunden wurden, und ein JsonResult zurückgibt.

Wenn Sie AngularJS verwenden, probieren Sie dies aus, wenn Sie es nicht tun ... sorry Kumpel :-)

Shabi_669
quelle
Downvoted, weil nicht mit der $ upload-Direktive
funktioniert