HTML-програма для вибору файлів для отримання файлів, які використовуються


12

Наступна проблема виникла за допомогою Firefox v73 у Вікні 7:

У своєму коді я використовую мультифайл-вибирач у html для завантаження до 100 файлів паралелі:

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

Файли будуть відправлені в REST-API, який потім обробляє їх. Коли я вибираю один файл (у файловому досліднику), який зараз використовується, я отримую повідомлення про помилку (можливо, за вікном), яке говорить мені, що файл неможливо вибрати, тому що він використовується. Якщо я спробую вибрати декілька файлів, які містять один або декілька файлів, які використовуються, у мене не виникає помилок, але завантаження, здається, припиняється, коли буде досягнуто використання файлу та чекає, коли файл вийде. Це призводить до прохання почекати тайм-аут (який у моєму випадку становить 1 хвилину).

Чи є можливість вирішити проблему (у файлі у використанні), перш ніж спробувати завантажити файли?

PS: Я спробував те ж саме в Chrome, і він надсилає помилку перед відправкою запиту в REST-API.


Чи можете ви показати свій ajax дзвінок?
Іслам Елшобокші

Відповіді:


3

Це звучить як проблема з ОС.
Щось блокує доступ до вашого файлу, і це потребує виправлення на вашій стороні.

Я сумніваюся, що це буде загальною проблемою, і досить важко створити рішення, не маючи можливості зіткнутися з тією ж проблемою, але одне, що ви можете спробувати, - це прочитати свої файли, перш ніж надсилати їх. Це можна зробити досить зручно Blob.prototype.arrayBufferметодом, який може бути заповненим.

Щоб уникнути багато вводу / виводу, ви можете навіть спробувати прочитати лише невелику його частину, завдяки 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>


Дякую Каїдо за рішення. Є ваша репутація +50. Рятувальник!
Кевін Х.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.