184

我正在使用HTML5构建一个drag-and-drop-to-upload web应用程序,我将文件放到一个div上,当然还获取dataTransfer对象,它为我提供了文件列表.

现在我想删除一些文件,但我不知道如何删除,或者是否可能删除。

最好我只想从文件列表中删除它们;我对他们毫无用处。但如果这不可能,我是否应该在与FileList交互的代码中写入检查?这看起来很麻烦。

  • 只是好奇:你为什么要这样做?为什么你会对用户选择的(一些)文件说“我没有用”? 评论 2010年7月1日23:12
  • 28
    这可能更便于用户在上传之前删除文件。如果你最初选择了20个,然后你决定不想上传第14个,那么你不能只删除那一个,你必须重新开始(这有点痛苦)。我认为将FileList设置为只读是一个错误的疏忽,除非我没有看到一些安全隐患。
    – 拉斐尔
    评论 2010年7月11日11:41
  • 直接从输入的FileList中删除文件是安全问题,但您可以在关闭文件上传对话框后立即克隆该FileList,然后修改该克隆并在通过ajax发布时使用它 评论 2020年1月30日13:32

20个答案20

重置为默认值
219

如果只想删除几个选定的文件:则不能文件API工作草案链接到的包含注释:

这个HTML输入元素接口[HTML5]有一个只读 文件列表属性,[…]
[强调我的]

读了一点HTML5工作草案,我发现通用输入元素API。您似乎可以删除整个的通过设置价值的财产输入对象转换为空字符串,如:

document.getElementById('multifile').value=“”;

顺便说一句,这篇文章使用web应用程序中的文件可能也很有趣。

9
  • 1
    请注意,属性是只读的意味着你不能更改它指向的对象。你可以操作FileList(如果可能的话),这只是意味着你不能给它分配一个新的FileList。 评论 2013年3月11日15:29
  • 1
    @RobinBerjon Chrome似乎忽略了“readonly”属性,而FireFox不允许写入操作。不幸的是,你建议操纵FileList在FireFox中也不起作用。 评论 2013年12月12日10:53
  • 1
    只有长度我想是只读的。我试图用splice删除一个项目,但在Chrome中失败了。
    – 芝耶利
    评论 2015年6月4日21:31
  • 有什么办法可以补充吗?
    – 路灯
    评论 2015年8月26日13:52
  • 2
    @路灯那将是一个巨大的安全漏洞,如果站点所有者可以确定从用户的计算机上传哪些文件。 评论 2015年8月27日14:26
80

由于JavaScript FileList是只读的,无法直接操作,

最佳方法

您必须循环通过输入.文件将其与指数要删除的文件的。同时,您将使用新数据传输()设置新的文件列表,不包括要从文件列表中删除的文件。

使用这种方法输入.文件自身发生了变化。

从文件列表中删除文件(索引){const dt=新数据传输();const输入=document.getElementById('files');const{files}=输入;for(设i=0;i<文件长度;i++){const文件=文件[i];if(索引!==i){dt.items.add(文件);//在这里,您排除了该文件。从而将其移除。}}/*将数据传输对象文件分配给“input”变量不会将数据传输文件写入其中,因为它没有对元素的引用:而是写入*/document.getElementById('files')=dt.files;//分配更新列表}

替代方法

另一个简单的方法是将FileList转换为数组,然后拼接它。

但这种方法不会改变输入.文件

const input=document.getElementById(“文件”);//作为一个数组,您可以更自由地使用数组函数转换文件列表。const fileListArr=Array.from(input.files);fileListArr.splice(索引,1);//这里你删除文件console.log(fileListArr);
  • 非常感谢您这么做,但是请注意,除非您从列表末尾删除文件,否则在某些情况下不会删除任何内容,因为每个循环上的索引都会重置,所以最好使用此技巧geeksforeks.org/how-to-get-the-child-node-index-in-javascript
    – ctf0型
    评论 2020年10月22日5:21
  • @这就是为什么你应该反向循环。从后面到数组开头。所以你永远不会弄乱指数。
    – 傻瓜
    评论 2021年3月27日12:04
  • 2
    谢谢你的替代方法,它有效!!!(:
    – 费多罗
    评论 2022年12月2日16:09
35

这个问题已经被标记为已回答,但我想分享一些信息,这些信息可能有助于其他人使用FileList。

将FileList视为数组是很方便的,但像sort、shift、pop和slice这样的方法不起作用。正如其他人所建议的那样,您可以将FileList复制到数组中。然而,不是使用循环,而是有一个简单的单行解决方案来处理此转换。

//fileDialog.files是FileListvar fileBuffer=[];//将文件列表附加到数组Array.prototype.push.apply(fileBuffer,fileDialog.files);//<--在这里//现在你可以根据需要操纵结果//将一项移出数组var file=fileBuffer.shift(0,1);//<--按预期工作console.info(文件名+“,”+文件大小+“,“+文件类型);//按大小排序文件fileBuffer.sort(函数(a,b){返回a.size>b.size?1:a.size<b.size-1 : 0;});

在FF、Chrome和IE10中测试合格+

5
  • 13
    数组.from(fileDialog.files)更简单 评论 2018年2月5日1:40
  • 1
    @穆罕默德·乌默尔(Muhammad Umer)-谢谢,我同意它更简单,并且被列为备选答案。然而,这取决于必须支持哪些浏览器,以及它们是否需要pollfill来使用Array.from()。请参见:stackoverflow.com/a/36810954/943435
    – 瑜伽
    评论 2018年2月5日3:51
  • 您实际上是如何修改FileList的?将此新数组分配给输入fileDialog.files=文件缓冲区?
    – 眩晕的
    评论 2019年1月2日2:00
  • @3zzy-可以修改FileList,但只能在现代浏览器中进行。有关详细信息,请参阅此SO问题:stackoverflow.com/a/47522812/943435
    – 瑜伽
    评论 2019年1月28日15:38
  • 是移位()还是拼接()?我认为应该是晚些时候。 评论 2021年8月19日12:17
26

如果您的目标是常青浏览器(Chrome、Firefox、Edge,但也适用于Safari 9+),或者您可以购买polyfill,您可以使用数组.from()这样地:

let fileArray=Array.from(fileList);

然后很容易处理文件就像其他数组一样。

14

由于我们在HTML5领域,这是我的解决方案。要点是,您将文件推送到一个数组中,而不是留在FileList中,然后使用XHR2将文件推送给FormData对象。示例如下。

Node.prototype.replaceWith=函数(节点){this.parentNode.replaceChild(节点,this);};if(window.File和window.FileList){var topicForm=document.getElementById(“yourForm”);topicForm.fileZone=文档.getElementById(“fileDropZoneElement”);topicForm.fileZone.files=新阵列();topicForm.fileZone.inputWindow=文档.createElement(“输入”);topicForm.fileZone.inputWindow.setAttribute(“类型”,“文件”);topicForm.fileZone.inputWindow.setAttribute(“多”,“多”);topicForm.onsubmit=函数(事件){var请求=新的XMLHttpRequest();if(请求.上传){event.proventDefault();topicForm.ajax.value=“true”;request.upload.onprogress=函数(事件){var progress=event.loaded.toString()+“传输的字节数”;if(event.length可计算)progress=数学.round(event.loaded/event.total*100).toString()+“%”;topicForm.fileZone.innerHTML=进度.toString();};request.onload=函数(事件){response=JSON.parse(request.responseText);//在此处处理响应。};request.open(topicForm.method,topicForm.getAttribute(“action”),true);var data=新FormData(topicForm);for(var i=0,file;file=topicForm.fileZone.files[i];i++)data.append(“文件”+i.toString(),文件);请求发送(数据);}};topicForm.fileZone.firstChild.replaceWith(document.createTextNode(“删除文件或单击此处”));var handleFiles=函数(文件){for(var i=0,文件;文件=files[i];i++)topicForm.fileZone.files.push(文件);};topicForm.fileZone.ondrop=函数(事件){event.stopPropagation();event.proventDefault();handleFiles(event.dataTransfer.files);};topicForm.fileZone.inputWindow.onchange=函数(事件){handleFiles(topicForm.fileZone.inputWindow.files);};topicForm.fileZone.ondragover=函数(事件){event.stopPropagation();event.proventDefault();};topicForm.fileZone.onclick=函数(){topicForm.fileZone.inputWindow.focus();topicForm.fileZone.inputWindow.click();};}其他的topicForm.fileZone.firstChild.replaceWith(document.createTextNode(“该更新浏览器了”));
1
10

我已经找到了非常快速和简短的解决方法。在许多流行浏览器(Chrome、Firefox、Safari)中进行测试;

首先,必须将FileList转换为Array

var newFileList=数组.from(event.target.files);

要删除特定元素,请使用以下命令

newFileList.splice(索引,1);
1
  • 22
    您从创建了新变量事件目标文件它没有链接到输入,因此除了局部变量之外,它不能更改任何内容。。 评论 2019年2月5日15:27
6

我知道这是一个老问题,但在搜索引擎中,它在这个问题上排名很高。

中的属性文件列表对象无法删除,但至少在Firefox上是这样他们可以改变。我解决此问题的方法是添加属性IsValid=真那些通过检查的文件IsValid=false给那些没有的人。

然后我只是循环遍历列表,以确保只有具有IsValid=真已添加到表单数据.

1

这是临时的,但我遇到了和我用这种方法解决的问题相同的问题。在我的例子中,我是通过XMLHttp请求上传文件的,所以我能够通过表单数据附加来发布FileList克隆的数据。功能是您可以根据需要多次拖放或选择多个文件(再次选择文件不会重置克隆的FileList),从(克隆的)文件列表中删除您想要的任何文件,并通过xmlhttprequest提交剩下的任何文件。这就是我所做的。这是我在这里的第一篇文章,所以代码有点乱。对不起的。啊,我不得不使用jQuery,而不是Joomla脚本中的$。

//一些全局变量var克隆={};//将是我的FileList克隆var removedkeys=0;//删除密钥计数器以便稍后处理请求var NextId=0;//计数器将条目添加到克隆而不替换现有条目jQuery(document).ready(function(){jQuery(“#form input”).change(function(){//制作克隆var curFiles=this.files;//将信息复制到克隆之前的临时对象克隆var temparr=jQuery.extend(true,{},curFiles);//删除克隆的不必要的FileList键删除temparr[“长度”];删除temparr[“项目”];if(Object.keys(clon).length===0){jQuery.extend(true、clon、temparr);}其他{var keysArr=对象.keys(克隆);NextId=数学.max.apply(null,keysArr)+1;//FileList键是数字if(NextId<curFiles.length){//我发现了一个错误,必须解决它,因为我没有替换temparr键。。。NextId=curFiles.length;}for(temparr中的var键){//我必须重命名新条目,以避免覆盖克隆中的现有键if(temparr.hasOwnProperty(key)){temparr[NextId]=temparr[key];删除temparr[key];//米aca los cambios de id en los html标签con el nuevo NextId下一个Id++;}} jQuery.extend(true、clon、temparr);//将新条目复制到克隆}//修改html文件列表显示if(NextId===0){jQuery(“#filelist”).html(“”);for(var i=0;i<curFiles.length;i++){var f=当前文件[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>“);//函数BorrarFile将按文件id处理从克隆中删除的文件}}其他{for(var i=0;i<curFiles.length;i++){var f=当前文件[i];jQuery(“#filelist”).append(“<p id=\”file“+(i+NextId-curFiles.length)+”\“style=\'margin-bottom:3px!important;\'>”+f.name+“<a style=\”float:right;光标:指针\“onclick=\”BorrarFile(“+(i+NextId-curFiles.length)+”)\“>x</a></p>”);//是的,i+NextId-curFiles.length实际上是正确的}        }//随时随地更新文件总数jQuery(“#form p”).text(Object.keys(clon).length+“选中的文件”);});});函数BorrarFile(id){//处理从克隆中删除文件jQuery(“#file”+id).remove();//删除html文件列表元素删除克隆[id];//删除条目删除的键++;//添加到删除的密钥计数器if(Object.keys(clon).length===0){jQuery(“#form p”).text(Object.keys(clon).length+“选中的文件”);jQuery(“#fileToUpload”).val(“”);//提交之前,我必须重置表单检查功能的表单文件输入。否则,即使我的克隆是空的,它也会发送}其他{jQuery(“#form p”).text(Object.keys(clon).length+“选中的文件”);}}//现在我的表单检查功能功能检查(){if(document.getElementById(“fileToUpload”).files.length==0){警报(“未选择文件”);返回false;}其他{var_validFileExtensions=[“.pdf”,“.pdf”];//我想要pdf文件//检索输入文件var arrInputs=克隆;//验证文件for(var i=0;i<Object.keys(arrInputs).length+removedkeys;i++){if(arrInputs[i]的类型!=“undefined”){var oInput=arrInputs[i];if(oInput.type==“application/pdf”){var sFileName=oInput.name;如果(sFileName.length>0){var blnValid=假;对于(var j=0;j<_validFileExtensions.length;j++){var sCurExtension=有效文件扩展[j];if(sFileName.substr(sFile Name.length-sCurExtension.length.sCurExtension.length-length).toLowerCase()==sCurExtence.toLoverCase(()){blnValid=真;断裂;}}如果(!bln有效){alert(“对不起,”+sFileName+“无效,允许的扩展名为:”+_validFileExtensions.join(“,”));返回false;}}}其他{alert(“对不起,”+arrInputs[0].name+“无效,允许的扩展名为:”+_validFileExtensions.join(“或”));返回false;}}}//继续数据追加和提交//这里有一些我之前设置的隐藏输入值。现在检索它们以提交。我的表格实际上甚至不是表格。。。var fecha=jQuery(“#fecha”).val();var vendor=jQuery(“#vendor”).val();var sku=jQuery(“#sku”).val();//创建formdata对象var formData=新formData();formData.append(“fecha”,fecha);formData.append(“vendor”,encodeURI(vendor));formData.append(“sku”,sku);//现在附加克隆文件数据(最后!)var fila=克隆;//我这样做是因为我已经使用“fila”对象编写了以下内容,所以我再次复制了我的克隆//有趣的部分。由于克隆对象中的条目不是连续的数字,我无法正常迭代,所以我想到了以下想法for(i=0;i<Object.keys(fila).length+removedkeys;i++){if(类型为fila[i]!=“未定义”){formData.append(“fileToUpload[]”,文件[i]);//非常重要的是,文件的formdata键必须是数组。稍后将检索为$_FILES['fileToUpload']['temp_name'][i]}}jQuery(“#submitbtn”)淡出(“慢”);//删除上传的btn,使其无法再次使用jQuery(“#drag”).html(“”);//清除输出消息元素//启动请求var xhttp=新的XMLHttpRequest();xhttp.addEventListener(“进度”,函数(e){var done=e.position | | e.loaded,total=e.totalSize | | e.total;},假);if(xhttp.upload){xhttp.upload.onprogress=函数(e){var done=e.position | | e.loaded,total=e.totalSize | | e.total;var百分比=完成/总计;jQuery(“#drag”).html(数学四舍五入(percent*100)+“%”);};}xhttp.onreadystatechange=函数(){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(表单数据);返回true;}};

现在是html和样式。我是个新手,但所有这些对我来说都很管用,花了我一段时间才弄明白。

<div id=“form”class=“formpos”><!--    选择要上传的pdf:--><input type=“file”name=“fileToUpload[]”id=“fileToUpload”accept=“application/pdf”multiple><div><p id=“drag”>将文件放在此处或单击选择它们</p></div>上传//这些输入在formdata上以不同的名称传递。请注意这一点//我重复了这一点,所以这就是为什么我对php变量使用单引号<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>尚未选择任何内容

它的样式。我不得不标记其中一些!重要的是要覆盖Joomla行为。

.formpos格式{宽度:500px;高度:200px;边框:4px虚线#999;边距:30px自动100px;}.表格位置p{文本对齐:居中!重要;填充:80px 30px 0px;颜色:#000;}.formpos目录{宽度:100%!重要;身高:100%!重要;文本对齐:居中!重要;边距-底部:30px!重要;}.formpos输入{位置:绝对!重要;边距:0!重要;填充:0!重要;宽度:500px!重要;高度:200px!重要;大纲:无!重要;不透明度:0!重要;}.formpos按钮{边距:0;颜色:#fff;背景:#16a085;边界:无;宽度:508px;高度:35px;左边边距:-4px;边距:4px;过渡:全部2秒轻松;大纲:无;}.formpos按钮:悬停{背景:#149174;颜色:#0C5645;}.formpos按钮:激活{边框:0;}

我希望这能有所帮助。

谢谢@Nicholas Anderson,简单明了,这是您应用的代码,并使用jquery处理我的代码。

HTML格式。

<input class=“rangelog btn border-aero”id=“file_fr”name=“file_xr[]”多类型=“file”占位符=“{$labels_helpfiles_placeholder_file}”>清空所选文件</span>

JS代码

函数cleanInputs(fileEle){$(fileEle).val(“”);var parEle=$(fileEle).parent();var newEle=$(fileEle).clone()$(fileEle).remove();$(parEle).prepend(newEle);}
0
1

也许有一种更优雅的方法可以做到这一点,但这是我的解决方案。使用Jquery

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

基本上,您可以确定输入的值。克隆它,并用克隆来代替旧的。

0
0

如果您有幸将post请求与文件一起发送到数据库,并且您有要在DOM中发送的文件

您可以简单地检查文件列表中的文件是否存在于DOM中,当然,如果不存在,只需不将该元素发送到deDB即可。

0

我意识到这是一个很古老的问题,但是我使用html多文件选择上传来对任意数量的文件进行排队,这些文件可以在提交之前在自定义UI中有选择地删除。

将文件保存在如下变量中:

let uploadedFiles=[];//在DOM文件内选择“onChange”事件让selected=e.target.files[0]?e.target.files:[];uploadedFiles=[…uploadedFile,…selected];创建元素();

使用创建UI“删除文件”:

函数createElements(){uploadedFiles.forEach((f,i)=>{//删除DOM元素并在此处重新创建它们/*//您可以显示这样的图像:*let reader=new FileReader();*reader.onload=函数(e){*让url=e.target.result;*//创建<img src=url/>*  };*reader.readAsDataURL(f);*/element.addEventListener(“点击”,函数(){uploadedFiles.splice(i,1);创建元素();});}}

提交到服务器:

设fd=新的FormData();uploadedFiles.forEach((f,i)=>{fd.append(“文件[]”,f);});获取(“yourEndpoint”,{方法:“POST”,主体:fd,标题:{//不设置Content-Type} }).然后(…)
0

我混合了许多开发人员的解决方案,并找到了这个解决方案。它会在删除后更改原始数组列表,这意味着如果我们想保存图像,那么我们可以这样做。

<脚本>var图像=[];函数image_select(){var image=document.getElementById('image').files;对于(i=0;i<图像长度;i++){图像.push({“name”:图像[i].name,“url”:url.createObjectURL(图像[i]),“文件”:图像[i],})}document.getElementById('container').innerHTML=image_show();}函数image_show(){var image=“”;images.forEach((i)=>{image+=`<div class=“image_container d-flex justify-content-center-position-relative”><img src=“`+i.url+`”alt=“图像”><span class=“position-absolute”onclick=“delete_image(`+images.indexOf(i)+`)”>&times</span></div>`;})返回图像;}函数delete_image(e){图像拼接(e,1);document.getElementById('container').innerHTML=image_show();const dt=新数据传输()const输入=document.getElementById('image')const{files}=输入for(设i=0;i<文件长度;i++){const文件=文件[i]如果(e!==i)dt.items.add(文件);}input.files=dt.files;console.log(document.getElementById('image').files);}</script>

*******这是html代码******

<body><div class=“集装箱mt-3 w-100”><div class=“卡片阴影-sm w-100”><div class=“card-header d-flex justify-content-between”>预览多个图像<form class=“form”action=“{{route('store')}}”method=“post”id=“form“enctype=”multipart/form-data“>@csrf公司<input type=“file”name=“image[]”id=“image”多onchange=“image_select()”>提交</form></div><div class=“card-body d-flex flex-wrap justify-content-start”id=“container”></div></div></div></body>

*******这是CSS代码********

<风格>.image_container(图像容器){高度:120px;宽度:200px;边距:6px;溢出:隐藏;边距:10px;}.image_container图像{高度:100%;宽度:自动;object-fit:封面;}.image_container范围{顶部:-6px;右:8px;颜色:红色;字体大小:28px;font-weight:正常;光标:指针;}</style>
0

我正在使用TypeScript,由于强类型检查,它在每一步都会抱怨。以下代码在Svelte中对我有效。这与斯维尔特无关。因此,它应该与所有使用TS的库/框架一起工作。

const ele=document.getElementById('file-upload')作为HTMLInputElement;if(ele){ele.value=“”;}
0
函数removeFile(idx:number){if(文件){let fileArr=Array.from(文件)文件排列拼接(idx,1)让tempObj:any=Object.assign({length:fileArr.length},fileArr)console.log(tempObj);设置文件(tempObj);}}
2
  • 虽然此代码片段可能是解决方案,包括解释真的有助于提高你的帖子质量。请记住,您是在为将来的读者回答这个问题,而这些人可能不知道您建议代码的原因。
    – 丹一
    评论 1月6日20:01
  • 请不要只发布代码答案。未来的读者会很高兴看到解释为什么?它回答了这个问题,而不必从代码中推断出来。此外,对老问题的新答案应该包含对它们如何补充其他答案的充分解释。 评论 1月6日21:13
0

显然,这在2024年仍是一件不太明显的事情。真正修改输入.文件列表似乎被替换为数据传输.files如中所示最佳答案.

下面是几乎相同的代码,但使用阵列减少:

函数removeFile(输入,索引){input.files=[…input.files]减少((dt,f,i)=>{如果(i!==索引){dt.项目.添加(f);}返回dt;},新数据传输().文件;}

下面是代码的一个更简洁的版本,但有点难以理解:

函数removeFile(输入,索引){input.files=[…input.files].reduce((dt,f,i)=>(i!==索引&&dt.items.add(f)&&0)||dt,new DataTransfer()).文件;}
-1

您可能希望创建一个数组,并使用它来代替只读文件列表。

var myReadWriteList=新阵列();//用户稍后选择文件。。。//那么只要方便。。。myReadWriteList=文件列表只读;

之后,根据列表而不是内置列表进行上传。我不确定您正在使用的上下文,但我正在使用一个我找到的jquery插件,我需要做的是获取插件的源代码并使用<脚本>标签。然后,在源代码的上方,我添加了数组,以便它可以作为全局变量,插件可以引用它。

然后,这只是一个交换引用的问题。

我认为这将允许您再次添加拖放,如果内置列表是只读的,那么您如何将拖放的文件放入列表中?

:))

2
  • 4
    我写得太快了。。。。似乎当一个人将var设置为等于文件列表时,只读问题又回来了。。。。因此,我选择做的是双重的&稍微痛苦但有效的。。。我保存了一个可查看的文件列表以供上传,用户可以从这里删除。。。显然,在<ul>标记中删除<li>标记很简单。。。所以我想到的唯一方法是保留一个删除文件的二级列表,并在上传过程中引用它。。。因此,如果文件在上传列表中,我就跳过它,用户也不会知道。 评论 2011年3月23日21:01
  • 1
    当您分配文件列表对象我的读写列表变量,它将其类型从阵列文件列表,所以这不是一个解决方案。
    – adlr0
    评论 2016年8月26日9:01
-1

我这样解决

//位置->需要删除的文件的位置this.fileImgs.forEach((项、索引、对象)=>{if(item.idColor===idC){if(item.imgs.length===1){对象.拼接(索引,1)}其他{const itemFileImgs=[…item.imgs];itemFileImgs.拼接(位置,1)item.imgs=[…itemFileImgs]}}});console.log(this.fileImgs)

在此处输入图像描述

-2

在vue js中:

自我$refs.inputFile.value=“”

1
  • 此方法删除所有文件。不是一个文件。 评论 2020年9月23日1:35
-3

我只需将输入类型更改为文本并返回到文件:D

2

你的答案

单击“发布您的答案”,表示您同意我们的服务条款并确认您已阅读我们的隐私政策.

不是你想要的答案吗?浏览标记的其他问题问你自己的问题.