handler-upload-file.js 1.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142
  1. import { sendMessage } from '@/utils/message';
  2. import { handleElement } from '../helper';
  3. function injectFiles(element, files) {
  4. const notFileTypeAttr = element.getAttribute('type') !== 'file';
  5. if (element.tagName !== 'INPUT' || notFileTypeAttr) return;
  6. element.files = files;
  7. element.dispatchEvent(new Event('change', { bubbles: true }));
  8. }
  9. export default async function (block) {
  10. const elements = handleElement(block, { returnElement: true });
  11. if (!elements) throw new Error('element-not-found');
  12. const getFile = async (path) => {
  13. const file = await sendMessage('get:file', path, 'background');
  14. const name = file.path.replace(/^.*[\\/]/, '');
  15. const blob = await fetch(file.objUrl).then((response) => response.blob());
  16. URL.revokeObjectURL(file.objUrl);
  17. return new File([blob], name, { type: file.type });
  18. };
  19. const filesPromises = await Promise.all(block.data.filePaths.map(getFile));
  20. const dataTransfer = filesPromises.reduce((acc, file) => {
  21. acc.items.add(file);
  22. return acc;
  23. }, new DataTransfer());
  24. if (block.data.multiple) {
  25. elements.forEach((element) => {
  26. injectFiles(element, dataTransfer.files);
  27. });
  28. } else {
  29. injectFiles(elements, dataTransfer.files);
  30. }
  31. }