HTML filepicker multi-获取正在使用的文件


12

在Windows 7上使用Firefox v73发生以下问题:

在我的代码中,我在html中使用了一个多文件选择器,最多可以并行上传100个文件:

<input type="file" id="files" name="files" multiple>

这些文件将被发送到REST-API,然后对其进行处理。当我选择一个当前正在使用的文件(在文件浏览器中)时,我收到一条错误消息(可能是通过窗口显示),告诉我该文件由于正在使用中而无法被选择。如果我尝试选择包含一个或多个正在使用的文件的多个文件,则不会发生任何错误,但是当达到使用中的文件并等待文件释放时,上传似乎停止了。这导致请求等待超时(在我的情况下为1分钟)。

在尝试上传文件之前,是否有任何选项可以解决问题(使用中的文件)?

PS:我在Chrome中尝试过相同的操作,在将请求发送到REST-API之前,它会返回错误。


你能显示你的ajax电话吗?
Islam Elshobokshy

Answers:


3

听起来像是操作系统问题。
某些情况导致文件无法访问,这需要您进行修复。

我怀疑这将是一个常见的问题,并且在无法遇到相同问题的情况下构建解决方案非常困难,但是您可以尝试的一件事是在发送文件之前先阅读文件。使用Blob.prototype.arrayBuffer方法可以很方便地完成,可以将其进行填充。

为了避免大量的I / O,由于Blob.prototype.slice() 方法的原因,您甚至可以尝试仅读取其中的一小部分。

const input = document.getElementById('inp');
const btn = document.getElementById('btn');

btn.onclick = async(evt) => {
  testAllFilesAvailability(input.files)
    .then(() => console.log('all good'))
    .catch(() => console.log('some are unavailable'));
}

function testAllFilesAvailability(files) {
  return Promise.all(
    [...files].map(file =>
      file.slice(0, Math.min(file.size, 4)) // don't load the whole file
      .arrayBuffer() // Blob.prototype.arrayBuffer may require a polyfill
    )
  );
}
<pre>
1. Select some files from the input
2. Change one of this files name on your hard-drive or even delete it
3. Press the button
</pre>

<input type="file" multiple id="inp">
<button id="btn">Test Availability</button>


感谢Kaiido的解决方案。有+50声望。救命!
Kevin H.

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.