jQuery Ajax Dosya Yükleme


755

Bir ajax isteğinin POST yöntemini kullanarak dosya yükleme gerçekleştirmek için aşağıdaki jQuery kodunu kullanabilir miyim?

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

Mümkünse, bir datakısmı doldurmam gerekir mi? Doğru yol mu? Ben sadece dosyayı sunucu tarafına POST.

Etrafta dolaşıyordum, ama planımda kullanırken bulduğum bir eklenti kullanmak istemiyorum. En azından şimdilik.


Ajax dosya yüklemelerini desteklemiyor, bunun yerine iframe kullanmalısınız
antyrat


Yanıtlar:


596

AJAX aracılığıyla dosya yüklemek mümkün değildir .
Düğmesini kullanarak sayfayı yenilemeden dosya yükleyebilirsiniz IFrame.
Daha fazla bilgiyi buradan kontrol edebilirsiniz .


GÜNCELLEME

XHR2 ile AJAX üzerinden dosya yükleme desteklenir. Örneğin FormDatanesne aracılığıyla , ancak maalesef tüm eski tarayıcılar tarafından desteklenmiyor.

FormData desteği, masaüstü tarayıcılarının sürümlerini izleyerek başlar.

  • IE 10+
  • Firefox 4.0+
  • Chrome 7+
  • Safari 5+
  • Opera 12+

Daha fazla ayrıntı için bkz. MDN bağlantısı .


41
Desteklenmeyen belirli tarayıcıların bir listesi: caniuse.com/#search=FormData Ayrıca bunu test etmedim ama burada FormData için bir çoklu dolgu var gist.github.com/3120320
Ryan White

152
Özellikle, IE <10 bağlantıyı okuyamayacak kadar tembel olanlar için değildir.
Kevin

22
@Synexis hayır daha fazla beklemek zorunda değiliz çünkü tüm IE sadece% 22 dünya çapında pazar payı ve ABD'de% 27 hızla düşüyor. Muhtemelen 70 yaşın üzerindeki insanlar. Bu nedenle IE, geliştiricilerin ne yapması gerektiğini dikte etmek IE'yi ya şekillendirmek ya da yarıştan çıkmak zorunda kalacak.
Drew Calder

30
@DrewCalder Çoğu IE kullanıcısı, şirket politikaları nedeniyle hangi tarayıcının kullanılacağına dair seçeneği olmayan ofis çalışanlarıdır. Yaşın bununla çok fazla alakası olmadığını düşünüyorum. Sanırım çoğu insan> 70'in yerine Chrome veya
FF'yi

3
Bu bağlantı gerçekten asgari olanı anlamama yardımcı oldu. Bir xhr isteği kullanmak zorunda değildim. Eğer kullanım ajax markasını yaparsanız emin ayarlamak enctypeiçin "form/multipart"!
Aydınlık

316

Ajax ile dosya yüklemek için iframe'lere artık gerek yoktur. Son zamanlarda kendim yaptım. Bu sayfalara göz atın:

AJAX ve jQuery ile HTML5 dosya yüklemelerini kullanma

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

Cevabı güncelledi ve temizledi. Boyutu kontrol etmek için getSize işlevini veya türleri kontrol etmek için getType işlevini kullanın. Progressbar html ve css kodu eklendi.

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

Upload sınıfını kullanma

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

İlerleme çubuğu HTML kodu

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

İlerleme çubuğu css kodu

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

3
Kodu az çok kopyalayıp doğrudan kullanabilirsiniz. Sadece bazı kimlik adlarını ve sınıf adlarını değiştirin. Herhangi bir özelleştirme kendi başına.
Ziinloader

4
MyXhr'un ad, boyut ve türün yanı sıra global olduğunu unutmayın. Ayrıca, daha önce oluşturulan XMLHttpRequest nesnesini genişletmek için "beforeSend" kullanmak daha sonra bunu değiştirmek için "xhr" kullanmaktan daha iyidir.
13'te awatts

8
@Ziinloader gibi kullanabileceğimizi sanmıyorum. Sen dahil değil bazı yerel yöntemi kullanıyorsanız: writer(catchFile). Nedir writer()?
tandrewnichols

4
Veriler yüklenecek dosya ile birlikte az sayıda alan içeriyorsa ne olur?
raju

2
@Ziinloader Bu, birkaç kez geri döndüğünüzü ve baktığınızı gördüğüm çok kullanışlı bir örnek. Gerçekten bir cevap verebileceğimden çok daha değerli bir cevap.
Düzenli Joe

190

Ajax gönderi ve yükleme dosyası mümkündür. jQuery $.ajaxDosyalarımı yüklemek için işlev kullanıyorum . XHR nesnesini kullanmaya çalıştım ama PHP ile sunucu tarafında sonuç alamadım.

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

Gördüğünüz gibi, boş veya (serileştirilmiş? - $('#yourForm').serialize())mevcut formdan) bir FormData nesnesi oluşturmanız ve ardından giriş dosyasını eklemeniz gerekir.

İşte bilgiler verilmiştir: - Bir jQuery.ajax ve FormData kullanarak dosyayı nasıl yüklenir? - jQuery yoluyla yükleyin dosyaları, nesne FormData sağlanır ve hiçbir dosya adı, GET isteği

PHP işlemi için şöyle bir şey kullanabilirsiniz:

//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
Bu kodu çalıştırmak için hangi jquery kitaplığına başvurmam gerekiyor?
Rayden Black

Cevap 2014 yılında yazılmıştır. JQuery versiyonu 1.10'dur. Daha yeni sürümlerle denemedim.
pedrozopayares

5
formData.append('file', $('#file')[0].files[0]);döner undefinedve console.log(formData) dışında hiçbir şey yok_proto_
Yakob Ubaidi

1
IE 9 tarafından desteklenmiyor, bazılarının benimle aynı cehennemde
kalması durumunda

3
Çalışmak için bu var ... Beni çimdik, ben jQuery Ajax dosya yükleme cenneti var! var formData = new FormData(); formData.append('file', document.getElementById('file').files[0]); $.ajax({ url : $("form[name='uploadPhoto']").attr("action"), 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); } });
TARKUS

104

Basit Yükleme Formu

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


efendim bu örnekte kullanılan j'ler nelerdir bunun için özel bir jquery eklentisi var ... burada işaret ettiğim bir soru var lütfen sorumu kontrol edebilirsin .. Bu projeye birden fazla dosya veya resim yüklemek istiyorum bağlantıdır stackoverflow.com/questions/28644200/…
Brownman Revival

19
$ (bu) [0] olan bu
machineaddict

2
Gönderilen dosya için sunucudaki parametre nedir? Lütfen sunucu bölümünü gönderebilir misiniz?
FrenkyB

@FrenkyB ve diğerleri - sunucudaki dosyalar (PHP'de) $ _POST değişkeninde saklanmaz - $ _FILES değişkeninde saklanır. Bu durumda, buna $ _FILES ["csv"] ile erişirsiniz çünkü "csv", giriş etiketinin ad niteliğidir.
dev_masta

68

Bunun için oldukça geç kaldım ama ajax tabanlı bir resim yükleme çözümü arıyordum ve aradığım cevap bu yazı boyunca biraz dağınıktı. Yerleştirdiğim çözüm FormData nesnesini içeriyordu. Bir araya getirdiğim kodun temel bir biçimini bir araya getirdim. Formun fd.append () ile nasıl özel bir alan ekleneceğini ve ajax isteği tamamlandığında yanıt verilerinin nasıl işleneceğini gösterir.

Html yükle:

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

Php ile çalışıyorsanız, yukarıdaki html'de gösterilen özel alanların her ikisinden de yararlanmayı içeren yüklemeyi işlemenin bir yolu.

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

i Cross origin requests are only supported for protocol schemes: http, data, chrome, chrome-extension, https,neden alıyorum bu yüzden efendim ben kopyala gibi yapıştır yapıştırın
Brownman Revival

2
@HogRider - hata mesajınızı Google'a gönderirseniz, bu ilk sonuçtur: stackoverflow.com/questions/10752055/… Web sayfalarınıza file://bir web sunucusu kullanmak yerine yerel olarak mı erişiyorsunuz ? Bir yana, kodu anlamadan körü körüne kopyalayıp yapıştırmak en iyi yöntem değildir. Kodu kullanmaya başlamadan önce neler olduğunu anlamak için kodu satır satır incelemenizi öneririm.
colincameron

@ colincameron satır satır üzerinden geçirdim birkaç şey açıklığa kavuştuğunuz için teşekkür ederim ve gerçekten çok fazla anlamıyorum bu yüzden birisi sordu şüphelerimi netleştirmek için soru sordu. Ben kesin olarak xampp bu arada yerel kullanıyorum. Açıklığa kavuşturabileceğiniz bir soru sorabilir miyim?
Brownman Revival

@Brownman Revival: Yanıt için çok geç olduğunu biliyorum .. Html dosyasını sunucudan çalıştırmak yerine dosya olarak açtığınız için bir çapraz kaynak hatası aldınız.
Adarsh ​​Mohan

@AdarshMohan Ben cevabı appreaciate doğru yapmak için bunu yapmak nasıl öneririm?
Brownman Revival

31

AJAX yüklemesi gerçekten mümkün XMLHttpRequest() . İç çerçeveye gerek yok. Yükleme ilerleme durumu gösterilebilir.

Ayrıntılar için bkz. JQuery Yükleme İlerleme Durumu ve AJAX dosya yüklemesini sorgulamak için https://stackoverflow.com/a/4943774/873282 kodunu yanıtlayın .


24
Ne yazık ki IE <10 bunu desteklemiyor.
Sasha Chedygov

1
Sadece başka bir sayfaya cevap olarak başvurmak istediğinizde, bir dupkucate olarak kapatmak veya sorunun altında yorum bırakmak için oy kullanabilirsiniz. Bu yazı bir cevap değil. Bu tür bir gönderi temsilcisi temsil etme çabası gibi görünüyor.
mickmackusa

18

İşte böyle çalışıyorum:

HTML

<input type="file" id="file">
<button id='process-file-button'>Process</button>

JS

$('#process-file-button').on('click', function (e) {
    let files = new FormData(), // you can consider this as 'data bag'
        url = 'yourUrl';

    files.append('fileName', $('#file')[0].files[0]); // append selected file to the bag named 'file'

    $.ajax({
        type: 'post',
        url: url,
        processData: false,
        contentType: false,
        data: files,
        success: function (response) {
            console.log(response);
        },
        error: function (err) {
            console.log(err);
        }
    });
});

PHP

if (isset($_FILES) && !empty($_FILES)) {
    $file = $_FILES['fileName'];
    $name = $file['name'];
    $path = $file['tmp_name'];


    // process your file

}

2
Bu konuda bana en çok yardımcı $('#file')[0].files[0]olan, uygun bir şekilde ihtiyaç duymadan bir çeşit garip JS geçici çözümü oldu<form>
ffgpga08

Bu tam bir çözüm, PHP bit de yardımcı olur.
cdsaenz

14

Böyle yapmak istiyorsanız:

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

göre

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

sizin çözümünüz olabilir.


$ Nesnesinde yükleme yöntemi nerede, yukarıdaki bağlantı mevcut değil
Aralık'ta serinleyen


2
Cevabınızı gönderdiğiniz için teşekkürler! Lütfen Kendi Kendini Tanıtma ile ilgili SSS bölümünü dikkatle okuyun. Ayrıca , kendi sitenize / ürününüze her bağlandığınızda bir feragatname yayınlamanız gerektiğini unutmayın .
Andrew Barber

13
  • Gizli bir iframe kullanın ve formunuzun hedefini bu iframe'in adına ayarlayın. Bu şekilde, form gönderildiğinde, yalnızca iframe yenilenir.
  • Yanıtı ayrıştırmak için iframe'in load olayı için bir olay işleyicisinin kayıtlı olmasını sağlayın.

Blog gönderimle ilgili daha fazla ayrıntı: http://blog.manki.in/2011/08/ajax-fie-upload.html .


Mümkünse iframe'lerden kaçının
Bhargav Nanekalva

@BhargavNanekalva endişeniz nedir?
aswzen

13
$("#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: Not içerik türü ve işlem verileri Sadece Ajax aracılığıyla dosya yüklemek için kullanabilirsiniz ...... giriş göndermek form öğesi dışında olamaz :)


3
Bu yöntemi kullanarak, form gönderebilir ancak 'dosya' türü alanlarıyla gönderemezsiniz. Bu soru özellikle dosya yükleme ile ilgilidir.
Jomy John

11

2019 güncellemesi:

html

<form class="fr" method='POST' enctype="multipart/form-data"> {% csrf_token %}
<textarea name='text'>
<input name='example_image'>
<button type="submit">
</form>

js

$(document).on('submit', '.fr', function(){

    $.ajax({ 
        type: 'post', 
        url: url, <--- you insert proper URL path to call your views.py function here.
        enctype: 'multipart/form-data',
        processData: false,
        contentType: false,
        data: new FormData(this) ,
        success: function(data) {
             console.log(data);
        }
        });
        return false;

    });

views.py

form = ThisForm(request.POST, request.FILES)

if form.is_valid():
    text = form.cleaned_data.get("text")
    example_image = request.FILES['example_image']

1
Bu daha önce verilen cevaplardan herhangi birini nasıl iyileştirir? Ayrıca bu cevap, Django olan ve soruyla hiçbir ilgisi olmayan bir views.py dosyasından bahsediyor.
dirkgroten

6
Django'yu kullanırken sorun kendini karşılaştırmalı olarak gösterdiğinden ve Django'yu kullanıyorsanız, burada çözme konusunda çok fazla yön yoktur. Gelecekte yaptığım gibi birinin buraya gelmesi durumunda proaktif yardım sunacağımı düşündüm. Zor bir gün geçiriyor musun?
Jay

9

FormData kullanın. Gerçekten iyi çalışıyor :-) ...

var jform = new FormData();
jform.append('user',$('#user').val());
jform.append('image',$('#image').get(0).files[0]); // Here's the important bit

$.ajax({
    url: '/your-form-processing-page-url-here',
    type: 'POST',
    data: jform,
    dataType: 'json',
    mimeType: 'multipart/form-data', // this too
    contentType: false,
    cache: false,
    processData: false,
    success: function(data, status, jqXHR){
        alert('Hooray! All is well.');
        console.log(data);
        console.log(status);
        console.log(jqXHR);

    },
    error: function(jqXHR,status,error){
        // Hopefully we should never reach here
        console.log(jqXHR);
        console.log(status);
        console.log(error);
    }
});

bu ne: ('kullanıcı', $ ('# kullanıcı'). val ());
rahim.nagori

id = "user" içeren metin kutusu @ rahim.nagori biçimine eklenir
Alp Altunel

7

Ajax üzerinden önizlemeden istenmeyen dosyaları kaldırdıktan sonra anında önizleme ve yükleme ile birden fazla dosya seçimi uyguladım.

Ayrıntılı dokümantasyona buradan ulaşabilirsiniz: http://anasthecoder.blogspot.ae/2014/12/multi-file-select-preview-without.html

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

@Bhargav: Açıklamalar için lütfen blog yayınına bakın: goo.gl/umgFFy . Hala herhangi bir sorunuz varsa, bana geri dön Teşekkürler
Ima

7

Bunları basit bir kodda ele aldım. Buradan çalışan bir demo indirebilirsiniz

Sizin durumunuz için bunlar mümkün. AJAX jquery kullanarak sunucuya nasıl bir dosya yükleyebilirsiniz adım adım götüreceğim.

Öncelikle aşağıdaki form dosyası öğesini aşağıda gösterildiği gibi eklemek için bir HTML dosyası oluşturalım.

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

İkincisi, bir jquery.js dosyası oluşturun ve dosyaya sunucuya gönderimimizi işlemek için aşağıdaki kodu ekleyin

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

İşte bitti. Daha fazla göster


7

FormData kullanmak birçok cevapla belirtildiği gibi gitmenin yoludur. İşte bu amaçla harika çalışan bir kod biraz. Karmaşık durumları tamamlamak için ajax bloklarını iç içe geçirmenin yorumuna da katılıyorum. E.PreventDefault () dahil ederek; deneyimlerime göre kodu daha çapraz tarayıcı uyumlu yapar.

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

bu form jquery validate aracılığıyla çalışır ... if (! fileupload.valid ()) {return false; }
Mike Volmar

7

Saf js kullanmak daha kolaydır

async function saveFile(inp) 
{
    let formData = new FormData();           
    formData.append("file", inp.files[0]);
    await fetch('/upload/somedata', {method: "POST", body: formData});    
    alert('success');
}
<input type="file" onchange="saveFile(this)" >

  • Sunucu tarafında, otomatik olarak talebe dahil edilen orijinal dosya adını (ve diğer bilgileri) okuyabilirsiniz.
  • "İçerik Türü" başlığını "çok parçalı / form verisi" tarayıcısına ayarlamanız gerekmez.
  • Bu çözümler tüm büyük tarayıcılarda çalışmalıdır.

Hata işleme ve ek json gönderme özelliğine sahip daha gelişmiş snippet


6

Evet, dosyayı almak için javascript kullanın ve dosyayı veri URL'si olarak okuduğunuzdan emin olun. Temel 64 kodlanmış verileri elde etmek için base64'ten önce bunları ayrıştırın ve daha sonra php veya gerçekten herhangi bir arka uç dili kullanıyorsanız, temel 64 verilerini çözebilir ve aşağıda gösterildiği gibi bir dosyaya kaydedebilirsiniz.

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

Tabii ki, hangi dosya türüyle uğraştığınızı kontrol etmek gibi bir doğrulama yapmak isteyeceksiniz ve bunun gibi şeyler ama bu fikir.


file_put_contents ($ fname, file_get_contents ($ _ POST ['veri'])); file_get_contents, kod çözme ve verilerle
ilgilenir

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

Sunucuya yüklemesi gereken bir dosya seçtiğinizde ajaxSubmit yöntemini aşağıdaki gibi kullanabilirsiniz: form sunucuya gönderilsin :)

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

2
Jquery form eklentisinden bahsettiğinize inanıyorum . Cevabınızdaki ayrıntıların olmaması dışında, burada gerçekten en iyi seçenektir.
fotanus

@fotanus haklısın! Bu komut dosyası, jquery form eklentisinde tanımlanan ajaxSubmit kullanım yöntemini göndermek için jquery form eklentisini kullanmalıdır
Quy Le

4

jquery kullanarak formun bir parçası olarak kullanıcı tarafından gönderilen bir dosyayı yüklemek için lütfen aşağıdaki kodu izleyin:

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

Sonra form veri nesnesini sunucuya gönderin.

Ayrıca doğrudan FormData nesnesine bir Dosya veya Blob ekleyebiliriz.

data.append("myfile", myBlob, "filename.txt");

3

AJAX kullanarak dosya yüklemek istiyorsanız, dosya yüklemek için kullanabileceğiniz kod.

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

İşte dosyayı yüklemek için HTML

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

3

Type = "file" dahil tüm form girişlerinizi almak için FormData nesnesini kullanmanız gerekir . formu gönderdikten sonra formData içeriğini hata ayıklayıcı -> network -> Headers içinde görebilirsiniz.

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

5
bazı ayrıntılar ekleyerek yanıtınızı geliştirebilirsiniz
SR

1

İşte düşündüğüm bir fikirdi:

Have an iframe on page and have a referencer.

INPUT: File öğesini içine taşıdığınız bir formunuz olsun.

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

Sonuç çerçeveye gönderilir ve sonra getirilen verileri istediğiniz görüntü etiketine bir düzey kadar gönderebilirsiniz:

data:image/png;base64,asdfasdfasdfasdfa

ve sayfa yüklenir.

Benim için işe yaradığına inanıyorum ve buna bağlı olarak şöyle bir şey yapabilirsiniz:

.aftersubmit(function(){
    stopPropigation()// or some other code which would prevent a refresh.
});

Bunun daha önce verilen başka bir cevabı nasıl geliştirdiğini görmüyorum. Ayrıca bu yayılma değil yayılma! ;)
JDuarteDJ
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.