Formsuz Dosya Yükleme


98

Herhangi bir form <input type="file">kullanmadan, jQuery kullanarak POST yöntemini kullanarak 'upload.php'ye bir dosya / dosya gönderebilir miyim ? Giriş etiketi herhangi bir form etiketinin içinde değildir. Ayrı ayrı duruyor. Bu yüzden 'ajaxForm' veya 'ajaxSubmit' gibi jQuery eklentilerini kullanmak istemiyorum.


1
Şunu deneyin: uploadify.com ancak flash sürümünü kullanın. Hadi, taşını at. HTML5 sürümünün form olmadan çalışıp çalışmadığından emin değilim. Muhtemelen olacak ama emin değilim.
Ismael Miguel

1
Arrr .... Ben HTML 5'te çalışması gerektiğini söylemek istiyorum. Ama platform uyumluluk sorunları ve birkaç yıldan daha eski tarayıcılar ile dolu olacak. Bir form yaratmanın ya da dinamik olarak netherlerden bir form oluşturmanın ne zararı olabilir?
Yitzhak

Yanıtlar:


98

Verilerinizi bir POST isteği ile göndermek için FormData'yı kullanabilirsiniz . İşte basit bir örnek:

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

İstek ayarınızı bildiğiniz sürece (url, yöntem ve parametre verileri gibi) bir ajax isteği yapmak için bir form kullanmanız gerekmez.


IMHO bu ancak başka seçenek düzenli sonrası geri yapabileceği içinde bir <iframe kullanmaktır, en iyi çözümdür
John Smith

Evet bu doğru. Eski tarayıcılar, dosyaları yüklemek için FormData ve ajax'ı desteklemez ve bu tarayıcılarda geri dönüş olarak iframe kullanılıyorsa çözümü destekler.
Omid Monshizadeh

7
Eklemeyi unutmayın processData: falseve contentType: falseYakalanmayan TypeError ayarları nesne ya da başka Sizin alacaksınız: Yasadışı çağırma
jsmiff

2
Ahbaplar, hayatımı kurtardınız !! : D @monshi ve @ jsmiff'e teşekkür ederim (SOF, aynı yorumda birden fazla kullanıcıya izin vermez).
Silvio Delgado

4
bunda pictureInput nedir?
developeraumya

34

Buradaki tüm yanıtlar hala FormData API kullanıyor . Formsuz bir "multipart/form-data"yükleme gibidir . Ayrıca, dosyayı aşağıdaki gibi POSTkullanarak doğrudan isteğin gövdesi içinde içerik olarak yükleyebilirsiniz xmlHttpRequest:

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-Typeve Content-Dispositionbaşlıklar ne gönderdiğimizi açıklamak için kullanılır (mime türü ve dosya adı).

Benzer cevabı burada da yayınladım .


1
Bu harika bir cevap. Form verilerinin kullanımından tamamen kaçınıyor. XmlHttpRequest kullanımına biraz daha ekleyebilirim. XMLHttpRequest, istemciyi engellemeyen (UI sayfası) zaman uyumsuz işlemlerin gerçekleştirilmesine izin verir. Bir HTML formu kullanılırken, işlem gerçekleştirilirken istemci (UI Sayfası) engellenir.
Harry

Peki ya fetch()?
Vitaly Zdanevich

@VitalyZdanevich bununla ne demek istediğinden emin değil misin?
Wilt

13

Bu öğreticiye dayanarak , işte bunu yapmanın çok basit bir yolu:

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

Uygun hata işlemeyi eklemeyi unutmayın


11

Adım 1: HTML Kodunun yerleştirileceği HTML Sayfası oluşturun.

Adım 2: HTML Kodu Sayfasının Altında (altbilgi) Javascript oluşturun: ve Jquery Kodunu Komut Dosyası etiketine yerleştirin.

Adım 3: PHP Dosyası oluşturun ve geçmiş php kodu kopyalayın. Kod url'deki Jquery Kodundan sonra $.ajaxphp dosya adınıza hangisini uygulayın.

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
Lütfen kodunuz için bazı yorumlar / açıklamalar ekleyin
kvorobiev

,sonradan eksiktype: 'post'
GoalsAndGambles


tmpFormun tamamı gönderilinceye kadar bir dizine dosya yükleyebilir misiniz ? (çoklu form olduğunu söyleyin)?
thesayhey

Bu form değişkenlerine java kodunda nasıl başvuracağım
Bhaskara Arani

1

Bu puglin simpleUpload'u deneyin , forma gerek yok

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

O adam olduğum için üzgünüm ama AngularJS basit ve zarif bir çözüm sunuyor.

İşte kullandığım kod:

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>

Sunucu tarafında, Request.Files koleksiyonunda bulunan ve bir JsonResult döndüren yüklenen dosyaları kaydeden bir eylem içeren bir MVC denetleyicim var.

AngularJS kullanıyorsanız, bunu deneyin, yoksa ... üzgünüm dostum :-)


$ Yükleme yönergesi ile çalışmaz, çünkü downvoted
NicoJuicy
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.