You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

拖拽超100个文件时event.dataTransfer.items仅返回100个的解决方法咨询

拖拽超100个文件时event.dataTransfer.items仅返回100个的解决方法咨询

嘿,这个问题我之前也踩过坑!主要是部分浏览器(比如Chrome)为了避免大量文件拖拽导致性能过载,会给event.dataTransfer.items设置100条的默认返回限制。不过别担心,有几个实用的方法可以解决这个问题:

方法一:改用event.dataTransfer.files获取完整文件列表

dataTransfer.files是直接映射拖拽的所有文件集合,大部分情况下不会有数量限制,修改你的drop事件代码试试:

const dropZone = document.getElementById('dropZone');
dropZone.addEventListener('drop', async (event) => {
  event.preventDefault();
  dropZone.classList.remove('dragover');

  // 替换成files属性获取完整文件列表
  const files = event.dataTransfer.files;
  console.log(`成功获取到 ${files.length} 个文件`);
  
  // 遍历处理所有文件
  Array.from(files).forEach((file, index) => {
    console.log(`第${index+1}个文件:${file.name}`);
  });
})

方法二:通过文件条目(Entry)提取文件(针对特殊受限场景)

如果第一种方法还是有问题,可以尝试通过dataTransfer.items获取文件条目,再逐个提取文件。这个方法稍显繁琐,但在部分特殊场景下有效:

dropZone.addEventListener('drop', async (event) => {
  event.preventDefault();
  dropZone.classList.remove('dragover');

  const items = event.dataTransfer.items;
  const allFiles = [];
  let processedCount = 0;

  for (const item of items) {
    // Chrome/Edge用webkitGetAsEntry,Firefox用getAsEntry
    const entry = item.webkitGetAsEntry() || item.getAsEntry();
    if (entry?.isFile) {
      entry.file(file => {
        allFiles.push(file);
        processedCount++;
        // 等所有条目处理完成后再执行后续逻辑
        if (processedCount === items.length) {
          console.log(`最终获取到 ${allFiles.length} 个文件`);
          // 这里添加你的文件处理逻辑
        }
      });
    }
  }
})

额外注意事项

因为你的代码是在Streamlit的iframe中运行,还要确认两个点:

  • iframe的源和主页面是否同域?跨域可能会触发额外的权限限制,影响文件获取
  • 可以尝试在浏览器无痕模式下测试,排除浏览器隐私/安全设置的干扰

优先试试第一种方法,应该能解决绝大多数情况!

备注:内容来源于stack exchange,提问作者Vladimir

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.14 09:54:31