ลากไฟล์วางลงในการป้อนไฟล์ html มาตรฐาน


163

วันนี้เราสามารถลากและวางไฟล์ลงในคอนเทนเนอร์พิเศษแล้วอัปโหลดด้วย XHR 2 หลายครั้ง ด้วยแถบความคืบหน้าสด ฯลฯ สิ่งดีๆมาก ตัวอย่างที่นี่

แต่บางครั้งเราไม่ต้องการความเยือกเย็นขนาดนั้น สิ่งที่ผมต้องการคือการลากและวางไฟล์ - หลายครั้ง - เข้าใส่ไฟล์ HTML มาตรฐาน<input type=file multiple> :

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

ทำไม? เพราะฉันต้องการส่งแบบฟอร์มปกติ สำหรับเบราว์เซอร์และอุปกรณ์ทั้งหมด การลากและวางเป็นเพียงการเพิ่มระดับความก้าวหน้าเพื่อปรับปรุงและลดความซับซ้อนของ UX แบบฟอร์มมาตรฐานพร้อมไฟล์อินพุตมาตรฐาน (+ multipleแอตทริบิวต์) จะอยู่ที่นั่น ฉันต้องการเพิ่มการปรับปรุง HTML5

แก้ไข
ฉันรู้ว่าในบางเบราว์เซอร์ที่คุณสามารถบางครั้ง (เกือบตลอดเวลา) วางไฟล์ลงในไฟล์ของตัวเอง ฉันรู้ว่า Chrome ทำเช่นนี้ แต่บางครั้งมันก็ล้มเหลวแล้วโหลดไฟล์ในหน้าปัจจุบัน (ล้มเหลวมากถ้าคุณกรอกแบบฟอร์ม) ฉันต้องการที่จะหลอก & เบราว์เซอร์มัน


1
เตรียมความพร้อมสำหรับความเจ็บปวดถ้าคุณต้องการรวม mac / ซาฟารีในความเข้ากันได้ของคุณ
Shark8

1
@ Shark8 ที่จริง Safari / Mac เป็นหนึ่งในไม่กี่เบราว์เซอร์ที่สนับสนุนสิ่งนี้อยู่แล้ว
Ricardo Tomasi

จริงๆแล้วไม่มีเบราว์เซอร์ใดที่สนับสนุนสิ่งนี้ ฟิลด์อินพุตไฟล์เป็นแบบอ่านอย่างเดียว (เพื่อความปลอดภัย) และนั่นคือปัญหา การรักษาความปลอดภัยที่โง่!
Rudie

2
โดยวิธีนี้ฉันหมายถึง "ลากและวางไฟล์ - หลายไฟล์ - ลงในอินพุตไฟล์ HTML มาตรฐาน"
Ricardo Tomasi

3
ลาก / วางหลายไฟล์เพื่อinput type="file" multipleทำงานได้ดีใน Safari
Lloyd

คำตอบ:


71

งานต่อไปนี้ใน Chrome และ FF แต่ฉันยังไม่พบโซลูชันที่ครอบคลุม IE10 + เช่นกัน:

// dragover and dragenter events need to have 'preventDefault' called
// in order for the 'drop' event to register. 
// See: https://developer.mozilla.org/en-US/docs/Web/Guide/HTML/Drag_operations#droptargets
dropContainer.ondragover = dropContainer.ondragenter = function(evt) {
  evt.preventDefault();
};

dropContainer.ondrop = function(evt) {
  // pretty simple -- but not for IE :(
  fileInput.files = evt.dataTransfer.files;

  // If you want to use some of the dropped files
  const dT = new DataTransfer();
  dT.items.add(evt.dataTransfer.files[0]);
  dT.items.add(evt.dataTransfer.files[3]);
  fileInput.files = dT.files;

  evt.preventDefault();
};
<!DOCTYPE html>
<html>
<body>
<div id="dropContainer" style="border:1px solid black;height:100px;">
   Drop Here
</div>
  Should update here:
  <input type="file" id="fileInput" />
</body>
</html>

คุณอาจต้องการใช้addEventListenerหรือ jQuery (ฯลฯ ) เพื่อลงทะเบียนตัวจัดการ evt ของคุณ - นี่เป็นเพียงเพื่อประโยชน์ของความกะทัดรัด


3
Waaaaaaaat! ใช้งานได้! นั่นคือว่าสิ่งที่ผมกำลังมองหา ไม่ทำงานเมื่อ 2 ปีก่อน ! น่ากลัว แน่นอนว่ามันใช้งานไม่ได้ใน IE =) คำถามสำคัญ: มีการตรวจจับคุณสมบัติที่เชื่อถือได้หรือไม่ดังนั้นคุณสามารถซ่อน dropzone ใน IE ได้หรือไม่เพราะมันจะไม่ทำงาน
Rudie

ตอนนี้ช้าไปหน่อย :) ตอนนี้ฉันแค่ใช้การตรวจสอบตัวแทนผู้ใช้ง่าย ๆ ใน JS แน่นอนคุณต้องทดสอบMSIE , Trident/(IE11) และEdge/(IE12) ...
JLB

FF 48.0.2 (Mac) พ่น "TypeError: การตั้งค่าคุณสมบัติที่มีเพียงทะเยอทะยานเป็น" fileInput.files = evt.dataTransfer.files;ที่บรรทัด Safari และ Chrome อย่างไรก็ตามทั้งคู่ทำงานได้ดี
Risadinha

2
ตัวอย่างนี้ใช้ไม่ได้กับ firefox 45 บน linux แต่ใช้งานได้กับ chrome ฉันไม่ได้รับข้อผิดพลาดของคอนโซล แต่ก็ไม่ได้แสดงว่าไฟล์ใด ๆ ตกไป
Bryan Oakley

1
จริง ๆ แล้วฉันสร้างโพสต์เพื่อลองและหาทางออก แต่คิดหาเอง เปลี่ยนง่าย ๆ เพียงแค่ fileInputs [index] = ... เพื่อส่งผ่านข้อมูลไฟล์ไปยังอินพุตเฉพาะจากนั้นเรียกใช้ฟังก์ชัน showNext เพื่อเพิ่มอินพุตใหม่stackoverflow.com/a/43397640/6392779
nick

51

ฉันทำทางออกสำหรับสิ่งนี้

ฟังก์ชันลากและวางสำหรับวิธีนี้ใช้ได้กับ Chrome, Firefox และ Safari เท่านั้น (ไม่ทราบว่าทำงานกับ IE10 ได้หรือไม่) แต่สำหรับเบราว์เซอร์อื่น ๆ ปุ่ม "หรือคลิกที่นี่" ก็ใช้งานได้ดี

ช่องป้อนข้อมูลเพียงแค่ตามเม้าส์ของคุณเมื่อลากไฟล์ไปวางบนพื้นที่และฉันได้เพิ่มปุ่มไว้เช่นกัน ..

ความทึบแสงที่ไม่ได้กล่าวถึง: 0; อินพุตไฟล์จะมองเห็นได้เท่านั้นดังนั้นคุณสามารถดูว่าเกิดอะไรขึ้น


นั่นเป็นเหตุผลที่ฉันเพิ่มปุ่มด้วย ^^ แต่ใช่คุณใช่แล้ว ฉันจะไม่ใช้มัน eather ... หรือฉันจะ!
BjarkeCK

ฉันหวังว่าฉันจะรู้ว่ามันควรจะทำงานอย่างไรดูเหมือนว่าฟังก์ชันการลาก / วางทั้งหมดจะต้องจัดการกับการเพิ่มเอฟเฟกต์โฮเวอร์ ... แต่ฉันไม่สามารถบอกได้ ดูดีในซอ แต่ฉันไม่คิดว่าฉันสามารถใช้งานได้เพราะฉันต้องการสนับสนุน Internet Explorer
nmz787

1
@PiotrKowalski ฉันคิดว่ามันอาจทำให้เกิดการโทรซ้ำซ้ำจนกระทั่งมี call stack overflows
John

2
ฉันลงเอยด้วยการใช้สไตล์เท่านั้น ทำให้อินพุตความกว้างและความสูง 100% ทำงานได้ดีกว่าการเลื่อนไปรอบ ๆ
Eddie

2
มีวิธีกำจัด "ไม่มีไฟล์ที่เลือก" ซึ่งคอยวนเวียนอยู่กับตัวชี้เมาส์ของเราหรือไม่? @BjarkeCK
Abhishek Singh

27

นี่คือวิธี "DTHML" HTML5 ที่จะทำ รูปแบบการป้อนข้อมูลปกติ (ซึ่งอ่านได้เฉพาะ Ricardo Tomasi ชี้ให้เห็น) ถ้าไฟล์ถูกลากมันจะแนบมากับแบบฟอร์ม WILL นี้ต้องการการแก้ไขหน้าการกระทำเพื่อยอมรับไฟล์ที่อัพโหลดด้วยวิธีนี้

function readfiles(files) {
  for (var i = 0; i < files.length; i++) {
    document.getElementById('fileDragName').value = files[i].name
    document.getElementById('fileDragSize').value = files[i].size
    document.getElementById('fileDragType').value = files[i].type
    reader = new FileReader();
    reader.onload = function(event) {
      document.getElementById('fileDragData').value = event.target.result;}
    reader.readAsDataURL(files[i]);
  }
}
var holder = document.getElementById('holder');
holder.ondragover = function () { this.className = 'hover'; return false; };
holder.ondragend = function () { this.className = ''; return false; };
holder.ondrop = function (e) {
  this.className = '';
  e.preventDefault();
  readfiles(e.dataTransfer.files);
}
#holder.hover { border: 10px dashed #0c0 !important; }
<form method="post" action="http://example.com/">
  <input type="file"><input id="fileDragName"><input id="fileDragSize"><input id="fileDragType"><input id="fileDragData">
  <div id="holder" style="width:200px; height:200px; border: 10px dashed #ccc"></div>
</form>

ถ้าคุณสามารถทำให้ทั้งหน้าต่างเป็นโซนปล่อยให้ดูฉันจะตรวจจับเหตุการณ์ลาก HTML5 เข้าและออกจากหน้าต่างได้อย่างไรเช่นเดียวกับ Gmail


1
ทางออกที่ดี แต่มันไม่ทำงานบน IE <10 เพราะ IE 9 และน้อยกว่าไม่รองรับไฟล์ HTML5 API :(
Develoger

1
บรรทัดนี้: document.getElementById ('fileDragData'). value = files [i] .slice (); ไม่จำเป็นเพราะมันถูกแทนที่ในฟังก์ชั่น
reader.onload

นี่เป็นอีกแอปพลิเคชั่นลากและวางที่น่ารักซึ่งไม่เกี่ยวข้องกับการอัปโหลดไฟล์ การเชื่อมโยงในกรณีที่ใครบางคนต้องการศึกษาเพิ่มเติม codepen.io/anon/pen/MOPvZK?editors=1010
William Entriken

1
โซลูชัน IE 10 คือการลดระดับและแสดงเฉพาะinput type=file
William Entriken

ฉันทำบางสิ่งบางอย่างหายไปหรือคุณแค่เขียนทับ.valueคุณสมบัติด้วยไฟล์ล่าสุดทุกครั้งที่คุณวนซ้ำไปเรื่อย ๆ
เควินเบิร์ค

13

//----------App.js---------------------//
$(document).ready(function() {
    var holder = document.getElementById('holder');
    holder.ondragover = function () { this.className = 'hover'; return false; };
    holder.ondrop = function (e) {
      this.className = 'hidden';
      e.preventDefault();
      var file = e.dataTransfer.files[0];
      var reader = new FileReader();
      reader.onload = function (event) {
          document.getElementById('image_droped').className='visible'
          $('#image_droped').attr('src', event.target.result);
      }
      reader.readAsDataURL(file);
    };
});
.holder_default {
    width:500px; 
    height:150px; 
    border: 3px dashed #ccc;
}

#holder.hover { 
    width:400px; 
    height:150px; 
    border: 3px dashed #0c0 !important; 
}

.hidden {
    visibility: hidden;
}

.visible {
    visibility: visible;
}
<!DOCTYPE html>

<html>
    <head>
        <title> HTML 5 </title>
        <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.6.4/jquery.js"></script>
    </head>
    <body>
      <form method="post" action="http://example.com/">
        <div id="holder" style="" id="holder" class="holder_default">
          <img src="" id="image_droped" width="200" style="border: 3px dashed #7A97FC;" class=" hidden"/>
        </div>
      </form>
    </body>
</html>


2
ผู้ใช้แสดงอะไร คุณสามารถทำซอหรือเป็นตัวอย่างออนไลน์ได้หรือไม่?
Rudie

@Rudie โปรดคลิกเรียกใช้โค้ดขนาดสั้นแล้วลากภาพไปวางเพื่อดูหนึ่งภาพมันจะแสดงตัวอย่างของภาพที่หล่น
Dipak

6

ในทางทฤษฎีคุณสามารถเพิ่มองค์ประกอบการซ้อนทับ<input/>จากนั้นใช้dropเหตุการณ์เพื่อจับไฟล์ (โดยใช้ File API) และส่งต่อไปยังอินพุตfilesอาร์เรย์

ยกเว้นว่าอินพุตไฟล์เป็นแบบอ่านอย่างเดียวอ่านอย่างเดียวนี่เป็นปัญหาเก่า

อย่างไรก็ตามคุณสามารถข้ามการควบคุมฟอร์มได้อย่างสมบูรณ์และอัปโหลดผ่าน XHR (ไม่แน่ใจเกี่ยวกับการสนับสนุนสำหรับสิ่งนั้น):

คุณสามารถใช้องค์ประกอบในพื้นที่โดยรอบเพื่อยกเลิกกิจกรรมการปล่อยใน Chrome และป้องกันพฤติกรรมเริ่มต้นของการโหลดไฟล์

การปล่อยหลายไฟล์บนอินพุตจะใช้งานได้แล้วใน Safari และ Firefox


6
อย่างที่ฉันพูดในคำถาม: ฉันรู้ XHR2 และฉันไม่ต้องการใช้ ฉันเดาส่วน iportant: "อินพุตไฟล์เป็นแบบอ่านอย่างเดียว" นั่นมัน ... การยกเลิกกิจกรรมการปล่อยไม่ได้เป็นความคิดที่ไม่ดี! ไม่ดีเท่าที่ฉันคาดหวัง แต่อาจดีที่สุด การปล่อยหลายไฟล์ทำงานใน Chrome ด้วยเช่นกัน ตอนนี้ Chrome ยังอนุญาตให้อัปโหลดไดเรกทอรี ทั้งหมด kewl มากและไม่ช่วยกรณีของฉัน = (
Rudie

5

นี่คือสิ่งที่ฉันออกมาด้วย

ใช้ Jquery และ Html จะเพิ่มลงในไฟล์แทรก

var dropzone = $('#dropzone')


dropzone.on('drag dragstart dragend dragover dragenter dragleave drop', function(e) {
    e.preventDefault();
    e.stopPropagation();
  })

dropzone.on('dragover dragenter', function() {
    $(this).addClass('is-dragover');
  })
dropzone.on('dragleave dragend drop', function() {
    $(this).removeClass('is-dragover');
  })  
  
dropzone.on('drop',function(e) {
	var files = e.originalEvent.dataTransfer.files;
	// Now select your file upload field 
	// $('input_field_file').prop('files',files)
  });
input {	margin: 15px 10px !important;}

.dropzone {
	padding: 50px;
	border: 2px dashed #060;
}

.dropzone.is-dragover {
  background-color: #e6ecef;
}

.dragover {
	bg-color: red;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
<div class="" draggable='true' style='padding: 20px'>
	<div id='dropzone' class='dropzone'>
		Drop Your File Here
	</div>
	</div>


4

สำหรับโซลูชัน CSS เท่านั้น:

<div class="file-area">
    <input type="file">
    <div class="file-dummy">
        <span class="default">Click to select a file, or drag it here</span>
        <span class="success">Great, your file is selected</span>
    </div>
</div>

.file-area {
    width: 100%;
    position: relative;
    font-size: 18px;
}
.file-area input[type=file] {
    position: absolute;
    width: 100%;
    height: 100%;
    top: 0;
    left: 0;
    right: 0;
    bottom: 0;
    opacity: 0;
    cursor: pointer;
}
.file-area .file-dummy {
    width: 100%;
    padding: 50px 30px;
    border: 2px dashed #ccc;
    background-color: #fff;
    text-align: center;
    transition: background 0.3s ease-in-out;
}
.file-area .file-dummy .success {
    display: none;
}
.file-area:hover .file-dummy {
    border: 2px dashed #1abc9c;
}
.file-area input[type=file]:valid + .file-dummy {
    border-color: #1abc9c;
}
.file-area input[type=file]:valid + .file-dummy .success {
    display: inline-block;
}
.file-area input[type=file]:valid + .file-dummy .default {
    display: none;
}

แก้ไขจากhttps://codepen.io/Scribblerockerz/pen/qdWzJw


4

ฉันรู้เคล็ดลับบางอย่างใช้งานได้ใน Chrome:

เมื่อวางไฟล์ลงในโซนดรอปคุณจะได้รับdataTransfer.filesวัตถุนั่นคือFileListประเภทของวัตถุที่มีไฟล์ทั้งหมดที่คุณลาก ในขณะที่<input type="file" />องค์ประกอบมีคุณสมบัติfilesนั่นคือFileListวัตถุชนิดเดียวกัน

ดังนั้นคุณสามารถกำหนดdataTransfer.filesวัตถุให้กับinput.filesคุณสมบัติ


3
ใช่มันทำวันนี้ ไม่หลอกลวง จงใจมาก ยังมีข้อ จำกัด อย่างมากโดยเจตนา คุณไม่สามารถเพิ่มไฟล์ลงในรายการหรือเปลี่ยนแปลงรายการได้เลย การลากและวางสามารถจดจำไฟล์และเพิ่มลงในไฟล์ได้ แต่input.filesไม่สามารถ = (
Rudie

3

สำหรับใครที่กำลังมองหาสิ่งนี้ในปี 2561 ฉันมีวิธีแก้ปัญหาที่ดีกว่าและง่ายกว่ามาก คุณสามารถสร้างกล่องลากและวางที่ดูดีด้วยเพียงแค่วานิลลา HTML, JavaScript และ CSS

(ใช้งานได้เฉพาะใน Chrome จนถึงตอนนี้)

เริ่มจาก HTML กันก่อน

<div>
<input type="file" name="file" id="file" class="file">
<span id="value"></span>
</div>

จากนั้นเราจะไปที่การออกแบบ

    .file {
        width: 400px;
        height: 50px;
        background: #171717;
        padding: 4px;
        border: 1px dashed #333;
        position: relative;
        cursor: pointer;
    }

    .file::before {
        content: '';
        position: absolute;
        background: #171717;
        font-size: 20px;
        top: 50%;
        left: 50%;
        transform: translate(-50%, -50%);
        width: 100%;
        height: 100%;
    }

    .file::after {
        content: 'Drag & Drop';
        position: absolute;
        color: #808080;
        font-size: 20px;
        top: 50%;
        left: 50%;
        transform: translate(-50%, -50%);
    }

หลังจากที่คุณทำสิ่งนี้แล้วมันก็ดูดี แต่ฉันคิดว่าคุณต้องการดูไฟล์ที่คุณอัปโหลดไฟล์ดังนั้นเราจะทำ JavaScript บางอย่าง จำไว้ว่า pfp-value span? นั่นคือสิ่งที่เราจะพิมพ์ชื่อไฟล์

let file = document.getElementById('file');
file.addEventListener('change', function() {
    if(file && file.value) {
        let val = file.files[0].name;
        document.getElementById('value').innerHTML = "Selected" + val;
    }
});

และนั่นคือมัน


ฉันได้รับ Uncaught TypeError: ไม่สามารถอ่านคุณสมบัติ 'addEventListener' เป็นโมฆะเมื่อฉันใช้รหัสนี้ - ภายใต้ Chrome - ใช้งานไม่ได้กับ Chrome เวอร์ชันล่าสุดใช่ไหม
Fight Fire With Fire

มันใช้งานได้ดีสำหรับฉันใน Chrome เวอร์ชันล่าสุด ตรวจสอบให้แน่ใจว่าคุณใช้ ID ที่ถูกต้อง
Michael

1

ผลงานยอดเยี่ยมโดย @BjarkeCK ฉันได้ทำการดัดแปลงงานของเขาเพื่อใช้เป็นวิธีใน jquery:

$.fn.dropZone = function() {
  var buttonId = "clickHere";
  var mouseOverClass = "mouse-over";

  var dropZone = this[0];
  var $dropZone = $(dropZone);
  var ooleft = $dropZone.offset().left;
  var ooright = $dropZone.outerWidth() + ooleft;
  var ootop = $dropZone.offset().top;
  var oobottom = $dropZone.outerHeight() + ootop;
  var inputFile = $dropZone.find("input[type='file']");
  dropZone.addEventListener("dragleave", function() {
    this.classList.remove(mouseOverClass);
  });
  dropZone.addEventListener("dragover", function(e) {
    console.dir(e);
    e.preventDefault();
    e.stopPropagation();
    this.classList.add(mouseOverClass);
    var x = e.pageX;
    var y = e.pageY;

    if (!(x < ooleft || x > ooright || y < ootop || y > oobottom)) {
      inputFile.offset({
        top: y - 15,
        left: x - 100
      });
    } else {
      inputFile.offset({
        top: -400,
        left: -400
      });
    }

  }, true);
  dropZone.addEventListener("drop", function(e) {
    this.classList.remove(mouseOverClass);
  }, true);
}

$('#drop-zone').dropZone();

Fiddle ทำงาน


1
FYI: ลิงก์ซอเสีย
jimiayler

1

ไม่กี่ปีต่อมาฉันได้สร้างห้องสมุดนี้เพื่อทำไฟล์ลงในองค์ประกอบ HTML ใด ๆ

คุณสามารถใช้มันเหมือน

const Droppable = require('droppable');

const droppable = new Droppable({
    element: document.querySelector('#my-droppable-element')
})

droppable.onFilesDropped((files) => {
    console.log('Files were dropped:', files);
});

// Clean up when you're done!
droppable.destroy();

วิธีหนึ่งเรียกไฟล์ที่เลือกในภายหลังเมื่อส่งแบบฟอร์ม?
Nikhil VJ

-1

สิ่งที่คุณจะทำคือการแสดงไฟล์ input file[1]และซ้อนทับกับการลดลงของพื้นที่โปร่งใสของการระมัดระวังในการใช้ชื่อเหมือน {ต้องแน่ใจว่ามีenctype="multipart/form-data"แท็ก FORM อยู่ภายใน}

จากนั้นให้ดรอปพื้นที่จัดการไฟล์พิเศษโดยการสร้างอินพุตไฟล์เพิ่มเติมสำหรับไฟล์ 2..number_of_files แบบไดนามิกตรวจสอบให้แน่ใจว่าใช้ชื่อฐานเดียวกันเติมค่าแอตทริบิวต์อย่างเหมาะสม

สุดท้าย (front-end) ส่งแบบฟอร์ม


สิ่งที่ต้องใช้ในการจัดการวิธีนี้คือการเปลี่ยนโพรซีเดอร์ของคุณเพื่อจัดการกับอาเรย์ของไฟล์


1
ไฟล์ที่ป้อนมีmultipleแอตทริบิวต์วันนี้ ไม่จำเป็นต้องใส่ไฟล์มากกว่า 1 ไฟล์ แต่นั่นไม่ใช่ปัญหา ฉันจะนำFileวัตถุเข้าไปในไฟล์อินพุตได้อย่างไร? ฉันคิดว่านี้ต้องใช้ตัวอย่างรหัสบางอย่าง ...
Rudie

1
@Rudie คุณทำไม่ได้นั่นคือปัญหา
Ricardo Tomasi

1
ทำอะไรไม่ได้ หลาย? ใช่คุณสามารถ. ฉันแค่พูดอย่างนั้น หลายรายการไม่ใช่ปัญหา การรับไฟล์จากวัตถุไฟล์ (ลาก) ลงในอินพุตไฟล์นั่นเป็นปัญหา
Rudie

@Rudie การลากไฟล์ลงในอินพุตไฟล์นั้นเป็นไปได้ด้วย Chrome / FF (ใช้filesคุณสมบัติ) แต่ฉันไม่ได้จัดการใน IE - คุณเคยโชคบ้างไหม?
jlb

1
@jlb คุณหมายถึงอะไร "ใช้คุณสมบัติไฟล์"? คุณสามารถตอบด้วยรหัสที่เกี่ยวข้องได้หรือไม่? สิ่งที่ฉันกำลังมองหาไม่ทำงาน / มีอยู่ในเบราว์เซอร์ใด ๆ
Rudie
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.