855 Stimmen

jQuery Ajax Datei-Upload

Kann ich den folgenden jQuery-Code verwenden, um Datei-Upload mit POST-Methode einer Ajax-Anfrage durchzuführen?

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

Wenn dies möglich ist, muss ich dann die data Teil? Ist das der richtige Weg? Ich POSTe die Datei nur an die Serverseite.

Ich habe herumgegoogelt, aber was ich gefunden habe, war ein Plugin, während ich es in meinem Plan nicht verwenden möchte. Zumindest für den Moment.

0 Stimmen

Ajax unterstützt keine Datei-Uploads, Sie sollten stattdessen iframe verwenden

1 Stimmen

2 Stimmen

640voto

Adeel Punkte 18797

Datei-Upload ist no durch AJAX möglich.
Sie können eine Datei hochladen, ohne die Seite zu aktualisieren, indem Sie IFrame .
Weitere Einzelheiten können Sie überprüfen aquí .


UPDATE

Mit XHR2 wird der Datei-Upload über AJAX unterstützt. Z.B. durch FormData Objekt, aber leider wird es nicht von allen/alten Browsern unterstützt.

FormData Die Unterstützung beginnt mit den folgenden Versionen der Desktop-Browser.

  • IE 10+
  • Firefox 4.0+
  • Chrom 7+
  • Safari 5+
  • Oper 12+

Für weitere Einzelheiten, siehe MDN-Link .

44 Stimmen

Hier finden Sie eine Liste der Browser, die nicht unterstützt werden: caniuse.com/#search=FormData Auch ich habe dies nicht getestet, aber hier ist ein Polyfill für FormData gist.github.com/3120320

168 Stimmen

Genauer gesagt, IE < 10 nicht, für diejenigen, die zu faul sind, den Link zu lesen.

0 Stimmen

2 Gedanken: 1. - Mann, das macht die Webentwicklung so wahnsinnig wildwestlich. 2. : @ Vicary - er spricht den "Jquery"-Teil der Frage an, indem er ihn einfach als eine Unwirklichkeit zum Zeitpunkt des Postings angibt - in diesem Sinne 100% korrekt und hilfreich. ADEEL - +1 großartige Antwort, wenn auch nur, weil Abwärtskompatibilität gleichbedeutend ist.

379voto

JohannesAndersson Punkte 4450

Iframes wird für das Hochladen von Dateien über Ajax nicht mehr benötigt. Ich habe es kürzlich selbst gemacht. Sehen Sie sich diese Seiten an:

Verwendung von HTML5-Datei-Uploads mit AJAX und jQuery

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

Die Antwort wurde aktualisiert und bereinigt. Verwenden Sie die Funktion getSize, um die Größe zu überprüfen, oder verwenden Sie die Funktion getType, um die Typen zu überprüfen. Fortschrittsbalken-HTML- und -CSS-Code hinzugefügt.

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

So verwenden Sie die Upload-Klasse

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

Fortschrittsanzeige HTML-Code

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

4 Stimmen

Sie können den Code mehr oder weniger direkt kopieren und verwenden. Ändern Sie lediglich einige ID-Namen und Klassennamen. Jede Anpassung ist auf Ihre eigene.

4 Stimmen

Beachten Sie, dass myXhr anscheinend global ist, ebenso wie Name, Größe und Typ. Auch ist es besser, "beforeSend" zu verwenden, um das bereits erstellte XMLHttpRequest-Objekt zu erweitern, anstatt "xhr" zu verwenden, um ein Objekt zu erstellen und es dann zu ändern.

8 Stimmen

Ich glaube nicht, dass wir das so verwenden können, wie es ist, @Ziinloader. Sie verwenden eine lokale Methode, die nicht enthalten ist: writer(catchFile) . Was ist writer() ?

256voto

pedrozopayares Punkte 2666

Ajax posten und Datei hochladen ist möglich. Ich verwende jQuery $.ajax Funktion, um meine Dateien zu laden. Ich habe versucht, das XHR-Objekt zu verwenden, konnte aber keine Ergebnisse auf der Serverseite mit PHP erzielen.

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

Wie Sie sehen können, müssen Sie ein FormData-Objekt erstellen, leer oder aus (serialisierten? - $('#yourForm').serialize()) vorhandenes Formular und fügen Sie die Eingabedatei an.

Hier finden Sie weitere Informationen: - Hochladen einer Datei mit jQuery.ajax und FormData - Hochladen von Dateien über jQuery, Objekt FormData wird bereitgestellt und kein Dateiname, GET-Anfrage

Für den PHP-Prozess können Sie etwas wie folgt verwenden:

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

Welche Jquery-Bibliothek muss ich verweisen, um diesen Code auszuführen?

0 Stimmen

Die Antwort stammt aus dem Jahr 2014. Die Version von JQuery war 1.10. Ich habe nicht versucht, mit neueren Versionen.

6 Stimmen

formData.append('file', $('#file')[0].files[0]); gibt zurück. undefined y console.log(formData) hat nichts außer _proto_

135voto

vickisys Punkte 1928

Einfaches Upload-Formular

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

0 Stimmen

Sir, was sind die js, die auf dieses Beispiel verwendet wurden, gibt es eine bestimmte Jquery-Plugin für diese ich habe eine Frage, die ich hier gezeigt wurde, können Sie bitte meine Frage überprüfen Ich möchte mehrere Dateien oder Bilder in diesem Projekt hochladen, hier ist der Link stackoverflow.com/questions/28644200/

27 Stimmen

$(this)[0] es este

2 Stimmen

Wie lautet der Parameter auf dem Server für "posted file"? Können Sie bitte den Serverteil posten.

73voto

lee8oi Punkte 1089

Ich bin ziemlich spät für diese, aber ich war auf der Suche nach einem Ajax-basierte Bild-Upload-Lösung und die Antwort, die ich suchte, war irgendwie in diesem Beitrag verstreut. Die Lösung, auf die ich mich geeinigt habe, beinhaltet das FormData-Objekt. Ich habe eine Grundform des Codes, den ich zusammengefügt habe, zusammengestellt. Sie können sehen, es zeigt, wie man ein benutzerdefiniertes Feld, um das Formular mit fd.append() sowie wie die Antwort Daten zu behandeln, wenn die Ajax-Anfrage fertig ist hinzufügen.

HTML hochladen:

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

Für den Fall, dass Sie mit php arbeiten, finden Sie hier einen Weg, den Upload zu handhaben, der die Verwendung der beiden benutzerdefinierten Felder beinhaltet, die in der obigen HTML gezeigt werden.

Hochladen.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";
}
?>

0 Stimmen

Ich bekomme Cross origin requests are only supported for protocol schemes: http, data, chrome, chrome-extension, https, Warum ist das so, Sir? Ich habe Ihren Code so kopiert, wie er ist.

2 Stimmen

@HogRider - wenn Sie Ihre Fehlermeldung googeln, ist dies das erste Ergebnis: stackoverflow.com/questions/10752055/ Greifen Sie lokal auf Ihre Webseiten zu über file:// anstatt einen Webserver zu verwenden? Nebenbei bemerkt ist es nicht die beste Praxis, Code einfach blind zu kopieren und einzufügen, ohne ihn vorher zu verstehen. Ich würde Ihnen empfehlen, den Code Zeile für Zeile durchzugehen, um zu verstehen, was passiert, bevor Sie den Code verwenden.

0 Stimmen

@colincameron vielen Dank für die Klärung einiger Dinge, ich bin den Text Zeile für Zeile durchgegangen und ich verstehe nicht wirklich viel, deshalb habe ich die Frage gestellt, damit jemand meine Zweifel klären kann. Ich benutze local by way xampp um genau zu sein. Kann ich eine Frage stellen, die Sie vielleicht klären können?

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X