อัปโหลดไฟล์โดยไม่มีแบบฟอร์ม


98

โดยไม่ต้องใช้รูปแบบใด ๆ ฉันสามารถส่งไฟล์ / ไฟล์จาก<input type="file">ไปที่ 'upload.php' โดยใช้วิธี POST โดยใช้ jQuery แท็กอินพุตไม่ได้อยู่ในแท็กฟอร์มใด ๆ มันยืนเป็นรายบุคคล ดังนั้นฉันไม่ต้องการใช้ปลั๊กอิน jQuery เช่น 'ajaxForm' หรือ 'ajaxSubmit'


1
ลองสิ่งนี้: uploadify.comแต่ใช้เวอร์ชันแฟลช มาโยนหินของคุณ ฉันไม่แน่ใจว่าเวอร์ชัน HTML5 ทำงานโดยไม่มีแบบฟอร์มได้หรือไม่ อาจจะ แต่ฉันไม่แน่ใจ
Ismael Miguel

1
Arrr .... ฉันต้องการบอกว่ามันควรจะทำงานใน HTML 5 แต่พวกเขาจะเต็มไปด้วยความเข้ากันได้ของแพลตฟอร์มปัญหา 'เบราว์เซอร์ที่เก่ากว่าสองสามปี อะไรคืออันตรายในการสร้างฟอร์มหรือสร้างแบบไดนามิกจากเนเทอร์?
Yitzhak

คำตอบ:


98

คุณสามารถใช้FormDataเพื่อส่งข้อมูลของคุณโดยการร้องขอ POST นี่คือตัวอย่างง่ายๆ:

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

คุณไม่จำเป็นต้องใช้แบบฟอร์มเพื่อสร้างคำขอ ajax ตราบใดที่คุณทราบการตั้งค่าคำขอของคุณ (เช่นข้อมูล url วิธีการและพารามิเตอร์)


IMHO นี่เป็นทางออกที่ดีที่สุด แต่อีกทางเลือกหนึ่งคือการใช้ <iframe ภายในคุณสามารถโพสต์ย้อนกลับได้เป็นประจำ
John Smith

ใช่นั่นคือเรื่องจริง เบราว์เซอร์รุ่นเก่าไม่รองรับ FormData และ ajax ในการอัปโหลดไฟล์และวิธีแก้ไขหากใช้ iframe เป็นทางเลือกในเบราว์เซอร์เหล่านั้น
Omid Monshizadeh

7
อย่าลืมเพิ่มprocessData: falseและcontentType: falseลงในออบเจ็กต์การตั้งค่ามิฉะนั้นคุณจะได้รับ Uncaught TypeError: Illegal invocation
jsmiff

2
พวกแกช่วยชีวิตฉัน !! : D ขอบคุณ @monshi และ @ jsmiff (SOF ไม่อนุญาตให้มีผู้ใช้หลายคนในความคิดเห็นเดียวกัน)
Silvio Delgado

4
pictureInput ในนี้คืออะไร ??
Developersaumya

34

คำตอบทั้งหมดในที่นี้จะยังคงใช้FormData API มันเหมือนกับการ"multipart/form-data"อัปโหลดโดยไม่มีรูปแบบ คุณยังสามารถอัปโหลดไฟล์โดยตรงเป็นเนื้อหาภายในเนื้อหาของPOSTคำขอโดยใช้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-TypeและContent-Dispositionส่วนหัวใช้สำหรับอธิบายสิ่งที่เรากำลังส่ง (ประเภท mime และชื่อไฟล์)

ฉันโพสต์คำตอบที่คล้ายกันไว้ที่นี่ด้วย


1
นี่คือคำตอบที่ดี เป็นการหลีกเลี่ยงการใช้ข้อมูลแบบฟอร์มโดยสิ้นเชิง ฉันสามารถเพิ่มการใช้งาน xmlHttpRequest ได้อีกเล็กน้อย XMLHttpRequest อนุญาตให้ดำเนินการแบบอะซิงโครนัสได้ซึ่งจะไม่ปิดกั้นไคลเอ็นต์ (หน้า UI) ในขณะที่ใช้รูปแบบ HTML ไคลเอนต์ (หน้า UI) จะถูกบล็อกในขณะที่กำลังดำเนินการ
Harry

เกี่ยวกับอะไรfetch()?
Vitaly Zdanevich

@VitalyZdanevich ไม่แน่ใจว่าคุณหมายถึงอะไร?
เหี่ยว

13

จากบทช่วยสอนนี้นี่เป็นวิธีพื้นฐานในการดำเนินการ:

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

อย่าลืมเพิ่มการจัดการข้อผิดพลาดที่เหมาะสม


11

ขั้นตอนที่ 1: สร้างเพจ HTML ที่จะวางโค้ด HTML

ขั้นตอนที่ 2: ในหน้าโค้ด HTML ด้านล่าง (ส่วนท้าย) สร้าง Javascript: และใส่ Jquery Code ในแท็กสคริปต์

ขั้นตอนที่ 3: สร้างไฟล์ PHP และคัดลอกโค้ด php ที่ผ่านมา หลังจาก Jquery Code ใน$.ajaxCode url ใช้อันไหนกับชื่อไฟล์ 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
โปรดเพิ่มความคิดเห็น / คำอธิบายสำหรับรหัสของคุณ
kvorobiev

หายไป,หลังจากtype: 'post'
GoalsAndGambles

1
ทำให้วันของฉัน :) ขอบคุณ
shekhardtu

คุณสามารถอัปโหลดไฟล์ไปยังtmpไดเร็กทอรีจนกว่าจะส่งแบบฟอร์มทั้งหมดได้หรือไม่ (บอกว่ามันมีหลายรูปแบบ)?
thesayhey

ฉันจะอ้างอิงตัวแปรรูปแบบเหล่านี้ในรหัส java ได้อย่างไร
Bhaskara Arani

1

ลองใช้ puglin simpleUploadไม่ต้องใช้แบบฟอร์ม

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

ขออภัยที่เป็นผู้ชายคนนั้นแต่ AngularJS นำเสนอโซลูชันที่เรียบง่ายและสง่างาม

นี่คือรหัสที่ฉันใช้:

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>

ที่ฝั่งเซิร์ฟเวอร์ฉันมีตัวควบคุม MVC พร้อมการดำเนินการที่บันทึกไฟล์ที่อัปโหลดที่พบใน Request.Files collection และส่งคืน JsonResult

หากคุณใช้ AngularJS ลองใช้สิ่งนี้หากคุณไม่ ... ขอโทษเพื่อน :-)


โหวตลดลงเนื่องจากใช้ไม่ได้กับคำสั่ง $ upload
NicoJuicy
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.