Javascript 让他们相信 提交文件

Javascript 让他们相信 提交文件,javascript,html,filelist,Javascript,Html,Filelist,这是您使用 您可以更改代码以实现所需的外观和功能 总之,以下代码的作用是: 创建新的FormData实例 从文件输入接受文件 将文件追加到在步骤1中创建的FormData的名为file-${index}字段中 为每个文件创建FileReader实例 FileReader读取文件内容并返回以base64编码字符串表示文件数据的结果 创建span元素,并将步骤5的文件内容作为src附加到img元素 将click侦听器附加到span上,因此当用户单击图像时,相应的文件将从步骤1的FormData中删除

这是您使用

您可以更改代码以实现所需的外观和功能

总之,以下代码的作用是:

  • 创建新的
    FormData
    实例
  • 从文件输入接受文件
  • 将文件追加到在步骤1中创建的
    FormData
    的名为
    file-${index}
    字段中
  • 为每个
    文件创建
    FileReader
    实例
  • FileReader
    读取文件内容并返回以base64编码字符串表示文件数据的结果
  • 创建
    span
    元素,并将步骤5的文件内容作为
    src
    附加到
    img
    元素
  • click
    侦听器附加到
    span
    上,因此当用户单击图像时,相应的文件将从步骤1的
    FormData
    中删除,而
    span
    将从
    DOM
    中删除
  • FormData
    将作为请求主体发送到后端,用户单击
    submit files
    按钮时使用
    sendFiles
    功能作为单击处理程序
  • 您可以在sunbmit按钮下看到附加到
    FormData
    的文件列表及其相应的表单字段名和原始文件名,该列表是使用
    listFiles
    函数生成的
    ul

    const formData=new formData();
    //用于FormData的文件字段名
    设指数=0;
    //用于列出当前文件
    常量列表文件=()=>{
    const list=document.createElement(“ul”);
    Array.from(formData.entries()).forEach((entry)=>{
    const item=document.createElement(“li”);
    item.innerHTML=条目[0]+“:“+条目[1]。名称;
    列表。追加子项(项目);
    });
    document.querySelector(“#fileList”).innerHTML=list.innerHTML;
    };
    //用于将文件发送到后端
    常量sendFiles=()=>{
    获取(“/upload/path”{
    正文:formData,
    方法:“张贴”,
    })
    .then((response)=>response.json())//如果响应是json格式的
    。然后((数据)=>{
    控制台日志(数据);
    })
    .catch((错误)=>{
    控制台错误(error);
    });
    };
    //用于输出fileReader输出和FormData的文件
    //它需要是异步的,因为fileReader onload事件具有异步性质,所以我们可以使用索引保持FormData和fileReader的同步
    常量读取文件=(文件)=>{
    返回新承诺((解决、拒绝)=>{
    const fileReader=new fileReader();
    fileReader.onload=(事件)=>{
    const theFile=event.target;
    返回解析([file,theFile]);
    };
    fileReader.readAsDataURL(文件);
    });
    };
    const handleFileSelect=async(事件)=>{
    var files=event.target.files;
    for(文件的常量文件){
    if(file.type.match(“image.*)){
    const[fileData,theFile]=等待读取文件(file);
    const id=`file-${index}`;
    formData.append(id,fileData);
    const span=document.createElement(“span”);
    const img=document.createElement(“img”);
    img.src=file.result;
    img.alt=“图像拇指”;
    img.title=escape(fileData.name);
    img.className=“拇指”;
    span.附加儿童(img);
    //用于从FormData中删除缩略图及其链接文件
    span.addEventListener(“单击”,()=>{
    formData.delete(id);
    //列出删除此缩略图后附加到FormData的当前文件
    listFiles();
    span.remove();
    });
    索引++;
    document.getElementById(“list”).insertBefore(span,null);
    }
    }
    //添加新文件后列出文件
    listFiles();
    };
    document.getElementById(“文件”).addEventListener(“更改”,handleFileSelect,false)
    
    .thumb{
    高度:75px;
    边框:1px实心#000;
    利润率:10px 5px 0;
    }
    
    
    单击图像以删除它们


    提交文件
      听起来好像你在说如果你
      console.log(files.length)
      ,它将始终输出
      1
      ?我无法复制。如果我选择多个文件,则
      文件。length
      是我选择的文件数。FileList并不总是1。我上传了3个项目,它显示了3个。我上传了一张我如何在console中查看文件列表的图片。听起来你好像在说如果你
      console.log(files.length)
      ,它将始终输出
      1
      ?我无法复制。如果我选择多个文件,则
      文件。length
      是我选择的文件数。FileList并不总是1。我上传了3个项目,它显示了3个。我上传了一张图片,我是如何在Consolence中看到文件列表的!它起作用了。是否有机会通过单独选择文件来获取文件列表?Thanks@sonEtLumiere您总是会得到一个文件列表,即使它包含一个文件。有很多方法可以将文件附加到
      输入.files
      ,但是数组不足以满足您的情况吗?那么数组和FormData就是一种方法。很好!它起作用了。是否有机会通过单独选择文件来获取文件列表?Thanks@sonEtLumiere您总是会得到一个文件列表,即使它包含一个文件。有很多方法可以将文件附加到
      输入.files
      ,但是数组不足以满足您的情况吗?那么数组和FormData就是一种方法。