为什么dataTransfer没有文件?

问题描述 投票:0回答:1

我正在研究前端并尝试实现文件拖放。我阅读了指南和文档并尝试实现这一点,但是当我拖动文件时,事件起作用并且 dataTransfer 中没有文件。

HTML:

<form
            id='upload-profile-avatar'
            class='form form-upload-avatar flex-column-centered flex-centered gap-10'
            action='/change_avatar'
            method='POST'
            enctype='multipart/form-data'
        >
            <div class='flex-column-centered flex-centered gap-5 upload-avatar-modal__image'><img
                    class='upload-avatar-modal__picture'
                    src='/img/upload.png'
                    alt='upload image'
                />
                <span class='upload-avatar-modal-image__message'>Drag Here</span></div>
            <div class='flex-centered upload-avatar-modal__alternative'><span
                    class='font-size-14 upload-avatar-modal-image__message'
                >or</span></div>
            <div class='form__input form__input-upload-avatar'>
                <button
                    type='button'
                    data-action='choose'
                    class='btn btn-upload-avatar padding-5-10 border-radius-5 font-size-16 font-weight-bold'
                    form='upload-avatar'
                >
                    <span>Upload<input
                            type='file'
                            data-name='upload-avatar'
                            accept='image/jpeg, image/png'
                            class='input input-upload-avatar'
                            name='user-avatar'
                        /></span>
                </button>
            </div>
            <div class='upload-avatar-modal__avatar-preview'><img
                    class='avatar border-radius-10 avatar-preview__image'
                    src=''
                    alt='avatar-preview'
                /><div class='flex-centered upload-avatar-modal__undo'><button
                        class='stratch-layout flex-centered border-radius-5 btn btn-revert-change-avatar'
                    ><img src='/svg/close.svg' alt='undo-change-avatar' /></button></div></div>
        </form>

我将文件放在此表格上。 JS:

const dropAvatarHandler = (e) => {
        e.preventDefault();
        console.log(e);
        const file = e.dataTransfer?.files[0];
        if(!file)
        return;
        e.target.querySelector('.input-upload-avatar').files[0]=file;
//function which does something with files
        previewAvatar(e);
        
    }

    const dragoverAvatarHandler = (e) => {
        e.preventDefault();
    }
        document.querySelector('.form-upload-avatar').addEventListener('dragover',dragoverAvatarHandler);
        document.querySelector('.form-upload-avatar').addEventListener('drop',dropAvatarHandler);

console.log 告诉我没有文件,但我删除了一个文件。 根据指南和文档,它必须有效,但我没有看到问题。

我尝试了一些指南,但仍然不起作用。

javascript html frontend drag-and-drop
1个回答
0
投票

不要将单个文件附加到输入的

FileList
,而是将
FileList
对象中的整个
DataTransfer
对象分配给输入对象。

const form = document.querySelector('.form-upload-avatar');

const dropAvatarHandler = (e) => {
  e.preventDefault();
  
  if (!e.dataTransfer.files.length) {
    return;
  }
  
  form.querySelector('.input-upload-avatar').files = e.dataTransfer.files;
}

const dragoverAvatarHandler = (e) => {
  e.preventDefault();
}

form.addEventListener('dragover', dragoverAvatarHandler);
form.addEventListener('drop', dropAvatarHandler);
<form id='upload-profile-avatar' class='form form-upload-avatar flex-column-centered flex-centered gap-10' action='/change_avatar' method='POST' enctype='multipart/form-data'>
  <div class='flex-column-centered flex-centered gap-5 upload-avatar-modal__image'><img class='upload-avatar-modal__picture' src='/img/upload.png' alt='upload image' />
    <span class='upload-avatar-modal-image__message'>Drag Here</span></div>
  <div class='flex-centered upload-avatar-modal__alternative'><span class='font-size-14 upload-avatar-modal-image__message'>or</span></div>
  <div class='form__input form__input-upload-avatar'>
    <button type='button' data-action='choose' class='btn btn-upload-avatar padding-5-10 border-radius-5 font-size-16 font-weight-bold' form='upload-avatar'>
                    <span>Upload<input
                            type='file'
                            data-name='upload-avatar'
                            accept='image/jpeg, image/png'
                            class='input input-upload-avatar'
                            name='user-avatar'
                        /></span>
                </button>
  </div>
  <div class='upload-avatar-modal__avatar-preview'><img class='avatar border-radius-10 avatar-preview__image' src='' alt='avatar-preview' />
    <div class='flex-centered upload-avatar-modal__undo'><button class='stratch-layout flex-centered border-radius-5 btn btn-revert-change-avatar'><img src='/svg/close.svg' alt='undo-change-avatar' /></button></div>
  </div>
</form>

© www.soinside.com 2019 - 2024. All rights reserved.