ฉันจะลบไฟล์ออกจาก FileList ได้อย่างไร


111

ฉันกำลังสร้างโปรแกรมประยุกต์บนเว็บการลากและวางเพื่ออัปโหลดโดยใช้ HTML5 และฉันวางไฟล์ลงบน div และแน่นอนเรียกวัตถุ DataTransfer ซึ่งจะช่วยให้ฉันFileList

ตอนนี้ฉันต้องการลบไฟล์บางไฟล์ออก แต่ฉันไม่รู้ว่าจะทำได้หรือไม่

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


แค่อยากรู้: ทำไมคุณถึงต้องการทำสิ่งนี้? ทำไมคุณถึงพูดว่า "ฉันไม่มีประโยชน์สำหรับพวกเขา" เกี่ยวกับ (บางไฟล์) ไฟล์ที่ผู้ใช้เลือก
Marcel Korpel

24
อาจเป็นไปได้มากกว่าที่ผู้ใช้จะสามารถลบไฟล์ก่อนที่จะอัปโหลด หากคุณได้เลือก 20 ไว้ แต่แรกแล้วคุณตัดสินใจว่าคุณไม่ต้องการอัปโหลดวันที่ 14 คุณจะไม่สามารถลบออกได้คุณต้องเริ่มใหม่ทั้งหมด (ซึ่งเป็นเรื่องที่น่าปวดหัว) ฉันคิดว่าการทำให้ FileList แบบอ่านอย่างเดียวเป็นการกำกับดูแลที่ไม่ดีเว้นแต่จะมีผลกระทบด้านความปลอดภัยที่ฉันไม่เห็น
Rafael

เป็นปัญหาด้านความปลอดภัยในการลบไฟล์จาก FileList ของอินพุตโดยตรง แต่คุณสามารถโคลน FileList นั้นได้ทันทีหลังจากปิดกล่องโต้ตอบการอัปโหลดไฟล์จากนั้นแก้ไขโคลนนี้และใช้เมื่อโพสต์ผ่าน ajax
alex_1948511

คำตอบ:


150

หากคุณต้องการลบเฉพาะไฟล์ที่เลือกหลายไฟล์คุณไม่สามารถทำได้ ไฟล์ API ทำงานร่างคุณเชื่อมโยงกับการมีบันทึก:

HTMLInputElementอินเตอร์เฟซ [HTML5] มีอ่านได้อย่างเดียว FileList แอตทริบิวต์ [ ... ]
[เหมืองเน้น]

อ่านบิตของร่าง HTML 5 ทำงานฉันมาข้ามสามัญinput APIs องค์ประกอบ ดูเหมือนว่าคุณสามารถลบทั้งรายการแฟ้มโดยการตั้งค่าvalueคุณสมบัติของinputวัตถุเป็นสตริงว่างเช่น:

document.getElementById('multifile').value = "";

BTW บทความการใช้ไฟล์จากเว็บแอปพลิเคชันอาจเป็นที่สนใจเช่นกัน


1
โปรดทราบว่าแอตทริบิวต์ที่อ่านอย่างเดียวไม่ได้หมายความว่าคุณไม่สามารถเปลี่ยนวัตถุที่ชี้ไปได้ คุณสามารถจัดการ FileList (ถ้าเป็นไปได้) นั่นหมายความว่าคุณไม่สามารถกำหนด FileList ใหม่ให้กับมันได้
Robin Berjon

1
@RobinBerjon Chrome ดูเหมือนจะไม่สนใจแอตทริบิวต์´readonly´ ในขณะที่ FireFox ไม่อนุญาตให้เขียน น่าเสียดายที่คำแนะนำของคุณในการจัดการ FileList ไม่สามารถใช้งานได้ใน FireFox เช่นกัน
borisdiakur

1
lengthฉันคิดว่ามีเพียง อ่านอย่างเดียวเท่านั้น ฉันพยายามลบรายการด้วยการประกบมันล้มเหลวใน Chrome
zhiyelee

มีวิธีไหนเพิ่มไหม
ไฟถนน

1
@streetlight นั่นจะเป็นช่องโหว่ด้านความปลอดภัยอย่างมากหากเจ้าของไซต์สามารถกำหนดได้ว่าจะอัปโหลดไฟล์ใดจากเครื่องของผู้ใช้
Marcel Korpel

30

คำถามนี้ถูกทำเครื่องหมายว่าตอบแล้ว แต่ฉันต้องการแบ่งปันข้อมูลบางอย่างที่อาจช่วยผู้อื่นในการใช้ FileList

จะสะดวกในการใช้ FileList เป็นอาร์เรย์ แต่วิธีการเช่น sort, shift, pop และ slice ไม่ได้ผล ตามที่คนอื่นแนะนำคุณสามารถคัดลอก FileList ไปยังอาร์เรย์ได้ อย่างไรก็ตามแทนที่จะใช้การวนซ้ำมีวิธีง่ายๆเพียงบรรทัดเดียวเพื่อจัดการกับ Conversion นี้

 // fileDialog.files is a FileList 

 var fileBuffer=[];

 // append the file list to an array
 Array.prototype.push.apply( fileBuffer, fileDialog.files ); // <-- here

 // And now you may manipulated the result as required

 // shift an item off the array
 var file = fileBuffer.shift(0,1);  // <-- works as expected
 console.info( file.name + ", " + file.size + ", " + file.type );

 // sort files by size
 fileBuffer.sort(function(a,b) {
    return a.size > b.size ? 1 : a.size < b.size ? -1 : 0;
 });

ทดสอบตกลงใน FF, Chrome และ IE10 +


4
Array.from(fileDialog.files)ง่ายกว่า
Muhammad Umer

1
@ มูฮัมหมัดอูเมอร์ - ขอบคุณฉันยอมรับว่ามันง่ายกว่าและถูกระบุไว้เป็นคำตอบทางเลือก อย่างไรก็ตามมันขึ้นอยู่กับว่าเบราว์เซอร์ใดที่เราต้องรองรับและถ้าพวกเขาต้องการ pollyfill เพื่อใช้ Array.from () ดู: stackoverflow.com/a/36810954/943435
Roberto

คุณแก้ไข FileList ได้อย่างไร? กำหนดอาร์เรย์ใหม่นี้ให้กับอินพุตfileDialog.files = fileBuffer หรือไม่
eozzy

@ 3zzy - เป็นไปได้ที่จะแก้ไข FileList แต่ในเบราว์เซอร์สมัยใหม่เท่านั้น ดูรายละเอียดคำถาม SO นี้: stackoverflow.com/a/47522812/943435
Roberto

22

หากคุณกำหนดเป้าหมายไปที่เบราว์เซอร์ที่เขียวชอุ่มตลอดปี (Chrome, Firefox, Edge แต่ยังใช้งานได้ใน Safari 9+) หรือคุณสามารถซื้อ polyfill ได้คุณสามารถเปลี่ยน FileList ให้เป็นอาร์เรย์ได้โดยใช้Array.from()สิ่งนี้:

let fileArray = Array.from(fileList);

จากนั้นก็จัดการอาร์เรย์ของFiles ได้ง่ายเหมือนกับอาร์เรย์อื่น ๆ


สมบูรณ์แบบ! คุณรู้หรือไม่ว่าการสนับสนุน IE เป็นอย่างไร? หรืออาจจะแชร์ลิงค์ไปยังโพลีฟิลล์ก็ได้?
Serhii Matrunchyk

ฉันยังไม่ได้ลอง แต่นี่เป็นผลการค้นหาแรกของ Google;) github.com/mathiasbynens/Array.from
adlr0

มันจะช่วยให้คุณจัดการfileArrayไม่ได้fileListเท่านั้น
VipinKundal

12

เนื่องจากเราอยู่ในขอบเขต HTML5 นี่คือทางออกของฉัน ประเด็นสำคัญคือคุณพุชไฟล์ไปยัง Array แทนที่จะทิ้งไว้ใน FileList จากนั้นใช้ XHR2 คุณจะผลักไฟล์ไปยังวัตถุ FormData ตัวอย่างด้านล่าง

Node.prototype.replaceWith = function(node)
{
    this.parentNode.replaceChild(node, this);
};
if(window.File && window.FileList)
{
    var topicForm = document.getElementById("yourForm");
    topicForm.fileZone = document.getElementById("fileDropZoneElement");
    topicForm.fileZone.files = new Array();
    topicForm.fileZone.inputWindow = document.createElement("input");
    topicForm.fileZone.inputWindow.setAttribute("type", "file");
    topicForm.fileZone.inputWindow.setAttribute("multiple", "multiple");
    topicForm.onsubmit = function(event)
    {
        var request = new XMLHttpRequest();
        if(request.upload)
        {
            event.preventDefault();
            topicForm.ajax.value = "true";
            request.upload.onprogress = function(event)
            {
                var progress = event.loaded.toString() + " bytes transfered.";
                if(event.lengthComputable)
                progress = Math.round(event.loaded / event.total * 100).toString() + "%";
                topicForm.fileZone.innerHTML = progress.toString();
            };
            request.onload = function(event)
            {
                response = JSON.parse(request.responseText);
                // Handle the response here.
            };
            request.open(topicForm.method, topicForm.getAttribute("action"), true);
            var data = new FormData(topicForm);
            for(var i = 0, file; file = topicForm.fileZone.files[i]; i++)
                data.append("file" + i.toString(), file);
            request.send(data);
        }
    };
    topicForm.fileZone.firstChild.replaceWith(document.createTextNode("Drop files or click here."));
    var handleFiles = function(files)
    {
        for(var i = 0, file; file = files[i]; i++)
            topicForm.fileZone.files.push(file);
    };
    topicForm.fileZone.ondrop = function(event)
    {
        event.stopPropagation();
        event.preventDefault();
        handleFiles(event.dataTransfer.files);
    };
    topicForm.fileZone.inputWindow.onchange = function(event)
    {
        handleFiles(topicForm.fileZone.inputWindow.files);
    };
    topicForm.fileZone.ondragover = function(event)
    {
        event.stopPropagation();
        event.preventDefault();
    };
    topicForm.fileZone.onclick = function()
    {
        topicForm.fileZone.inputWindow.focus();
        topicForm.fileZone.inputWindow.click();
    };
}
else
    topicForm.fileZone.firstChild.replaceWith(document.createTextNode("It's time to update your browser."));

ajax เป็นวิธีเดียวที่ฉันเดา?
Muhammad Umer

10

ฉันพบวิธีแก้ปัญหาสั้น ๆ และรวดเร็วมากสำหรับสิ่งนี้ ผ่านการทดสอบในเบราว์เซอร์ยอดนิยมจำนวนมาก (Chrome, Firefox, Safari);

ขั้นแรกคุณต้องแปลง FileList เป็น Array

var newFileList = Array.from(event.target.files);

ในการลบองค์ประกอบเฉพาะให้ใช้สิ่งนี้

newFileList.splice(index,1);

12
คุณได้สร้างตัวแปรใหม่event.target.filesซึ่งไม่ได้เชื่อมโยงกับอินพุตดังนั้นจึงไม่สามารถเปลี่ยนแปลงอะไรได้เลยนอกจากตัวแปรภายในของคุณ ..
Maksims Kitajevs

6

ฉันรู้ว่านี่เป็นคำถามเก่า แต่มีอันดับสูงในเครื่องมือค้นหาเกี่ยวกับปัญหานี้

คุณสมบัติในอ็อบเจ็กต์FileListไม่สามารถลบได้ แต่อย่างน้อยบน Firefox ก็สามารถเปลี่ยนแปลงได้ วิธีแก้ปัญหาของฉันปัญหานี้คือการเพิ่มสถานที่ให้บริการIsValid=trueไปยังไฟล์ที่ผ่านการตรวจสอบและIsValid=falseให้กับผู้ที่ไม่ได้

แล้วฉันห่วงเพียงผ่านรายการเพื่อให้แน่ใจว่ามีเพียงคุณสมบัติที่มีIsValid=trueจะมีการเพิ่มFormData


formdata คุณจึงส่งผ่าน ajax?
Muhammad Umer

1

อาจมีวิธีที่หรูหรากว่านี้ แต่นี่คือวิธีแก้ปัญหาของฉัน ด้วย Jquery

fileEle.value = "";
var parEle = $(fileEle).parent();
var newEle = $(fileEle).clone()
$(fileEle).remove();
parEle.append(newEle);

โดยทั่วไปคุณจะล้างค่าของอินพุต ลอกแบบและใส่โคลนแทนอันเก่า


1

นี่เป็นเรื่องชั่วคราว แต่ฉันมีปัญหาเดียวกันซึ่งฉันแก้ไขด้วยวิธีนี้ ในกรณีของฉันฉันอัปโหลดไฟล์ผ่านคำขอ XMLHttp ดังนั้นฉันจึงสามารถโพสต์ข้อมูลที่โคลน FileList ผ่านการต่อท้าย formdata ฟังก์ชันการทำงานคือคุณสามารถลากและวางหรือเลือกไฟล์หลาย ๆ ไฟล์ได้หลายครั้งตามที่คุณต้องการ (การเลือกไฟล์อีกครั้งจะไม่รีเซ็ต FileList ที่โคลน) ลบไฟล์ใด ๆ ที่คุณต้องการออกจากรายการไฟล์ (โคลน) และส่งผ่าน xmlhttprequest อะไรก็ได้ ทิ้งไว้ที่นั่น นี่คือสิ่งที่ฉันทำ นี่เป็นโพสต์แรกของฉันที่นี่ดังนั้นโค้ดจึงยุ่งเล็กน้อย ขออภัย. อ่าและฉันต้องใช้ jQuery แทน $ เหมือนในสคริปต์ Joomla

// some global variables
var clon = {};  // will be my FileList clone
var removedkeys = 0; // removed keys counter for later processing the request
var NextId = 0; // counter to add entries to the clone and not replace existing ones

jQuery(document).ready(function(){
    jQuery("#form input").change(function () {

    // making the clone
    var curFiles = this.files;
    // temporary object clone before copying info to the clone
    var temparr = jQuery.extend(true, {}, curFiles);
    // delete unnecessary FileList keys that were cloned
    delete temparr["length"];
    delete temparr["item"];

    if (Object.keys(clon).length === 0){
       jQuery.extend(true, clon, temparr);
    }else{
       var keysArr = Object.keys(clon);
       NextId = Math.max.apply(null, keysArr)+1; // FileList keys are numbers
       if (NextId < curFiles.length){ // a bug I found and had to solve for not replacing my temparr keys...
          NextId = curFiles.length;
       }
       for (var key in temparr) { // I have to rename new entries for not overwriting existing keys in clon
          if (temparr.hasOwnProperty(key)) {
             temparr[NextId] = temparr[key];
             delete temparr[key];
                // meter aca los cambios de id en los html tags con el nuevo NextId
                NextId++;
          }
       } 
       jQuery.extend(true, clon, temparr); // copy new entries to clon
    }

// modifying the html file list display

if (NextId === 0){
    jQuery("#filelist").html("");
    for(var i=0; i<curFiles.length; i++) {
        var f = curFiles[i];
        jQuery("#filelist").append("<p id=\"file"+i+"\" style=\'margin-bottom: 3px!important;\'>" + f.name + "<a style=\"float:right;cursor:pointer;\" onclick=\"BorrarFile("+i+")\">x</a></p>"); // the function BorrarFile will handle file deletion from the clone by file id
    }
}else{
    for(var i=0; i<curFiles.length; i++) {
        var f = curFiles[i];
        jQuery("#filelist").append("<p id=\"file"+(i+NextId-curFiles.length)+"\" style=\'margin-bottom: 3px!important;\'>" + f.name + "<a style=\"float:right;cursor:pointer;\" onclick=\"BorrarFile("+(i+NextId-curFiles.length)+")\">x</a></p>"); // yeap, i+NextId-curFiles.length actually gets it right
    }        
}
// update the total files count wherever you want
jQuery("#form p").text(Object.keys(clon).length + " file(s) selected");
    });
});

function BorrarFile(id){ // handling file deletion from clone
    jQuery("#file"+id).remove(); // remove the html filelist element
    delete clon[id]; // delete the entry
    removedkeys++; // add to removed keys counter
    if (Object.keys(clon).length === 0){
        jQuery("#form p").text(Object.keys(clon).length + " file(s) selected");
        jQuery("#fileToUpload").val(""); // I had to reset the form file input for my form check function before submission. Else it would send even though my clone was empty
    }else{
        jQuery("#form p").text(Object.keys(clon).length + " file(s) selected");
    }
}
// now my form check function

function check(){
    if( document.getElementById("fileToUpload").files.length == 0 ){
        alert("No file selected");
        return false;
    }else{
        var _validFileExtensions = [".pdf", ".PDF"]; // I wanted pdf files
        // retrieve input files
        var arrInputs = clon;

       // validating files
       for (var i = 0; i < Object.keys(arrInputs).length+removedkeys; i++) {
         if (typeof arrInputs[i]!="undefined"){
           var oInput = arrInputs[i];
           if (oInput.type == "application/pdf") {
               var sFileName = oInput.name;
               if (sFileName.length > 0) {
                   var blnValid = false;
                   for (var j = 0; j < _validFileExtensions.length; j++) {
                     var sCurExtension = _validFileExtensions[j];
                     if (sFileName.substr(sFileName.length - sCurExtension.length, sCurExtension.length).toLowerCase() == sCurExtension.toLowerCase()) {
                       blnValid = true;
                       break;
                     }
                   }
                  if (!blnValid) {
                    alert("Sorry, " + sFileName + " is invalid, allowed extensions are: " + _validFileExtensions.join(", "));
                    return false;
                  }
              }
           }else{
           alert("Sorry, " + arrInputs[0].name + " is invalid, allowed extensions are: " + _validFileExtensions.join(" or "));
           return false;
           }
         }
       }

    // proceed with the data appending and submission
    // here some hidden input values i had previously set. Now retrieving them for submission. My form wasn't actually even a form...
    var fecha = jQuery("#fecha").val();
    var vendor = jQuery("#vendor").val();
    var sku = jQuery("#sku").val();
    // create the formdata object
    var formData = new FormData();
    formData.append("fecha", fecha);
    formData.append("vendor", encodeURI(vendor));
    formData.append("sku", sku);
    // now appending the clone file data (finally!)
    var fila = clon; // i just did this because I had already written the following using the "fila" object, so I copy my clone again
    // the interesting part. As entries in my clone object aren't consecutive numbers I cannot iterate normally, so I came up with the following idea
    for (i = 0; i < Object.keys(fila).length+removedkeys; i++) { 
        if(typeof fila[i]!="undefined"){
            formData.append("fileToUpload[]", fila[i]); // VERY IMPORTANT the formdata key for the files HAS to be an array. It will be later retrieved as $_FILES['fileToUpload']['temp_name'][i]
        }
    }
    jQuery("#submitbtn").fadeOut("slow"); // remove the upload btn so it can't be used again
    jQuery("#drag").html(""); // clearing the output message element
    // start the request
    var xhttp = new XMLHttpRequest();
    xhttp.addEventListener("progress", function(e) {
            var done = e.position || e.loaded, total = e.totalSize || e.total;
        }, false);
        if ( xhttp.upload ) {
            xhttp.upload.onprogress = function(e) {
                var done = e.position || e.loaded, total = e.totalSize || e.total;
                var percent = done / total;
                jQuery("#drag").html(Math.round(percent * 100) + "%");
            };
        }
      xhttp.onreadystatechange = function() {
        if (this.readyState == 4 && this.status == 200) {
         var respuesta = this.responseText;
         jQuery("#drag").html(respuesta);
        }
      };
      xhttp.open("POST", "your_upload_handler.php", true);  
      xhttp.send(formData);
    return true;
    }
};

ตอนนี้ html และรูปแบบสำหรับสิ่งนี้ ฉันค่อนข้างเป็นมือใหม่ แต่ทั้งหมดนี้ใช้ได้ผลจริงสำหรับฉันและฉันใช้เวลาสักพักในการคิดออก

<div id="form" class="formpos">
<!--    Select the pdf to upload:-->
  <input type="file" name="fileToUpload[]" id="fileToUpload" accept="application/pdf" multiple>
  <div><p id="drag">Drop your files here or click to select them</p>
  </div>
  <button id="submitbtn" onclick="return check()" >Upload</button>
// these inputs are passed with different names on the formdata. Be aware of that
// I was echoing this, so that's why I use the single quote for php variables
  <input type="hidden" id="fecha" name="fecha_copy" value="'.$fecha.'" />
  <input type="hidden" id="vendor" name="vendorname" value="'.$vendor.'" />
  <input type="hidden" id="sku" name="sku" value="'.$sku.'"" />
</div>
<h1 style="width: 500px!important;margin:20px auto 0px!important;font-size:24px!important;">File list:</h1>
<div id="filelist" style="width: 500px!important;margin:10px auto 0px!important;">Nothing selected yet</div>

รูปแบบสำหรับสิ่งนั้น ฉันต้องทำเครื่องหมายบางส่วน! สิ่งสำคัญในการลบล้างพฤติกรรมของ Joomla

.formpos{
  width: 500px;
  height: 200px;
  border: 4px dashed #999;
  margin: 30px auto 100px;
 }
.formpos  p{
  text-align: center!important;
  padding: 80px 30px 0px;
  color: #000;
}
.formpos  div{
  width: 100%!important;
  height: 100%!important;
  text-align: center!important;
  margin-bottom: 30px!important;
}
.formpos input{
  position: absolute!important;
  margin: 0!important;
  padding: 0!important;
  width: 500px!important;
  height: 200px!important;
  outline: none!important;
  opacity: 0!important;
}
.formpos button{
  margin: 0;
  color: #fff;
  background: #16a085;
  border: none;
  width: 508px;
  height: 35px;
  margin-left: -4px;
  border-radius: 4px;
  transition: all .2s ease;
  outline: none;
}
.formpos button:hover{
  background: #149174;
  color: #0C5645;
}
.formpos button:active{
  border:0;
}

ฉันหวังว่านี่จะช่วยได้.


1

ขอบคุณ @Nicholas Anderson ง่ายและตรงนี่คือรหัสของคุณที่ใช้และทำงานกับรหัสของฉันโดยใช้ jquery

HTML

<input class="rangelog btn border-aero" id="file_fr" name="file_fr[]" multiple type="file" placeholder="{$labels_helpfiles_placeholder_file}">
<span style="cursor: pointer; cursor: hand;" onclick="cleanInputs($('#file_fr'))"><i class="fa fa-trash"></i> Empty chosen files</span>

รหัส JS

   function cleanInputs(fileEle){
    $(fileEle).val("");
    var parEle = $(fileEle).parent();
    var newEle = $(fileEle).clone()
    $(fileEle).remove();
    $(parEle).prepend(newEle);
}


0

หากคุณมีโชคในการส่งคำขอโพสต์ไปยังฐานข้อมูลพร้อมไฟล์และคุณมีไฟล์ที่คุณต้องการส่งใน DOM ของคุณ

คุณสามารถตรวจสอบได้ว่าไฟล์ในรายการไฟล์มีอยู่ใน DOM ของคุณหรือไม่และแน่นอนว่าถ้าไม่ใช่คุณก็ไม่ส่งองค์ประกอบนั้นไปที่เดอ DB


-1

คุณอาจต้องการสร้างอาร์เรย์และใช้แทนรายการไฟล์แบบอ่านอย่างเดียว

var myReadWriteList = new Array();
// user selects files later...
// then as soon as convenient... 
myReadWriteList = FileListReadOnly;

หลังจากนั้นให้ทำการอัปโหลดกับรายการของคุณแทนรายการที่สร้างขึ้น ฉันไม่แน่ใจในบริบทที่คุณกำลังทำงานอยู่ แต่ฉันกำลังทำงานกับปลั๊กอิน jquery ที่ฉันพบและสิ่งที่ฉันต้องทำคือรับแหล่งที่มาของปลั๊กอินและวางไว้ในหน้าโดยใช้<script>แท็ก จากนั้นเหนือแหล่งที่มาฉันได้เพิ่มอาร์เรย์ของฉันเพื่อให้สามารถทำหน้าที่เป็นตัวแปรส่วนกลางและปลั๊กอินสามารถอ้างอิงได้

จากนั้นก็เป็นเพียงเรื่องของการแลกเปลี่ยนข้อมูลอ้างอิง

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

:))


4
ฉันเขียนเร็วเกินไป .... ดูเหมือนว่าช่วงเวลาหนึ่งที่ตั้งค่า var ให้เท่ากับรายการไฟล์ปัญหาแบบอ่านอย่างเดียวกลับมา .... ดังนั้นสิ่งที่ฉันเลือกทำคือสองเท่า & เจ็บปวดเล็กน้อย แต่ได้ผล ... ฉันเก็บ รายการไฟล์ที่มองเห็นได้สำหรับการอัปโหลดและจากที่นี่ผู้ใช้สามารถลบ ... เห็นได้ชัดว่าการลบแท็ก <li> ในแท็ก <ul> นั้นตรงไปตรงมา ... ดังนั้นวิธีเดียวที่ฉันคิดขึ้นมาคือเก็บรายการรองไว้ ของไฟล์ที่ถูกลบและอ้างถึงในระหว่างกระบวนการอัปโหลด ... ดังนั้นหากไฟล์นั้นอยู่ในรายการอัปโหลดฉันก็ข้ามไปและผู้ใช้ก็ไม่มีใครฉลาด
cary abramoff

เมื่อคุณกำหนดFileListออบเจ็กต์ให้กับmyReadWriteListตัวแปรมันจะเปลี่ยนประเภทจากArrayเป็นFileListดังนั้นนี่ไม่ใช่วิธีแก้
adlr0

-2

ฉันแค่เปลี่ยนประเภทของอินพุตเป็นข้อความและกลับไปที่ไฟล์: D


นี่ถือเป็นการแสดงความคิดเห็น
Ivan Kaloyanov

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