HTML filepicker multi - get file đang sử dụng


12

Đã xảy ra sự cố sau khi sử dụng Firefox v73 trên Window 7:

Trong mã của tôi, tôi sử dụng một trình chọn nhiều tệp trong html để tải lên tới 100 tệp tương đương:

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

Các tệp sẽ được gửi đến REST-API để xử lý chúng sau đó. Khi tôi chọn một tệp duy nhất (trong trình thám hiểm tệp) hiện đang được sử dụng, tôi nhận được thông báo lỗi (có thể là do cửa sổ) cho tôi biết rằng tệp đó không thể được chọn vì nó đang được sử dụng. Nếu tôi cố gắng chọn nhiều tệp có chứa một hoặc nhiều tệp đang sử dụng, tôi không có lỗi xảy ra nhưng quá trình tải lên dường như dừng lại khi đạt đến tệp đang sử dụng và chờ đợi tệp được phát hành. Điều này dẫn đến yêu cầu chờ thời gian chờ (trong trường hợp của tôi là 1 phút).

Có tùy chọn nào để bắt lỗi (trong tệp sử dụng) trước khi thử tải tệp lên không?

Tái bút: Tôi đã thử tương tự trong Chrome và nó trả về lỗi trước khi gửi yêu cầu tới REST-API.


Bạn có thể hiển thị cuộc gọi ajax của bạn?
Hồi giáo Elshobokshy

Câu trả lời:


3

Nghe có vẻ như một vấn đề hệ điều hành.
Một cái gì đó đang khóa tập tin của bạn khỏi bị truy cập và điều này cần một sửa chữa về phía bạn.

Tôi nghi ngờ đây sẽ là một vấn đề phổ biến và khá khó để xây dựng giải pháp mà không gặp phải vấn đề tương tự nhưng một điều bạn có thể thử là đọc Tệp của mình trước khi gửi. Điều này có thể được thực hiện khá thuận tiện với Blob.prototype.arrayBufferphương pháp, có thể được polyfill.

Để tránh nhiều I / O, bạn thậm chí có thể cố gắng chỉ đọc một phần nhỏ của nó, nhờ Blob.prototype.slice() phương thức.

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>


Cảm ơn Kaiido cho giải pháp. Có danh tiếng +50 của bạn. Phao cứu sinh!
Kevin H.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.