programing

페이지에 파일을 드롭할 때 파일 입력 값을 설정하는 방법은 무엇입니까?

minimums 2023. 10. 25. 23:13
반응형

페이지에 파일을 드롭할 때 파일 입력 값을 설정하는 방법은 무엇입니까?

양식에 제출할 파일을 선택하고 파일을 드롭하여 동일한 작업을 수행할 수 있는 컨트롤을 만들려고 합니다.이미지인 경우 파일 미리보기를 보여주는 다음과 같은 기능이 있습니다.

<div class="preview-image-container">

  <input type="file" name="File" id="File" accept="image/*" 
         class="image-url form-control" style="display:none;" />

  <div class="preview-image-dummy"></div><img class="preview-image-url" />
  <div class="preview-image-instruction">
    <div class="preview-image-btn-browse btn btn-primary">Select file</div>
    <p>or drop it here.</p>
  </div>

</div>

MCVE에 대한 연주를 들어보겠습니다.

사용자가 파일을 삭제합니다.preview-image-container. 파일이 AJAX와 함께 제출되지 않아 사용자는 더 많은 데이터가 포함된 양식을 제출해야 합니다.

보안상의 이유로 자바스크립트로 입력 파일의 값을 변경할 수 없습니다.하지만 기본 입력 파일이 드롭 가능을 지원하고 파일을 양식에 저장하여 선택할 수 있는 웹 사이트가 많이 있다는 것을 알고 있기 때문에 방법이 있을 것 같습니다.

MCVE에서 볼 수 있듯이, 저는 별도의 라이브러리 없이 jQuery나 순수 자바스크립트만 사용하는 것에 관심이 있습니다.

dropzone.js를 사용할 수는 있지만 제 요구사항에 맞지 않고 모양을 커스터마이징하는 데 상당한 시간이 걸릴 것입니다.또한 dropzone.js에는 내 ASP 내에서 충족할 수 없는 특정 구성 요구 사항이 있습니다.NET 적용.


비슷한 질문이 있지만 적절한 대답이 없습니다.
HTML의 형태로 파일 객체를 입력 파일로 설정하는 방법은?

또한 이미 드래그 드롭 및 미리보기 작업을 완료했기 때문에 업로드 전에 드래그 드롭 이미지 입력 파일 미리보기와 유사하지 않습니다.제 질문은 상위 컨테이너에 파일을 떨어뜨릴 때 빈 파일 입력이 발생하는 문제입니다.

면책 사항:2017년 12월 현재 최신 브라우저에 한해 수정.


TL;DR: 네, 이제 가능합니다!

*데이터 전송 또는 파일 목록 개체가 있는 경우

이전에 프로그래밍 방식으로 파일 변경input[type=file]최신 브라우저에서 수정되는 레거시 보안 취약성으로 인해 필드가 비활성화되었습니다.

최근 주요 브라우저 중 마지막(Firefox)에서는 입력 파일 필드의 파일을 설정할 수 있습니다.W3C가 실시한 테스트에 의하면, 여러분은 이미 구글 크롬에서 이것을 할 수 있는 것 같습니다!

MDN에서 인용한 관련 스크린샷 및 텍스트:

enter image description here

설정할 수 있을 뿐만 아니라 다음과 같은 값을 얻을 수 있습니다.HTMLInputElement.files모든 최신 브라우저에서
소스 및 브라우저 호환성, MDN 참조

Firefox 버그 수정 토론 스레드에는 테스트할 수 있는 데모가 있으며, 편집하려면 여기 소스가 있습니다.이 링크가 삭제된 경우를 대비하여 다음과 같이 실행 가능한 토막글로 추가합니다.

let target = document.documentElement;
let body = document.body;
let fileInput = document.querySelector('input');

target.addEventListener('dragover', (e) => {
  e.preventDefault();
  body.classList.add('dragging');
});

target.addEventListener('dragleave', () => {
  body.classList.remove('dragging');
});

target.addEventListener('drop', (e) => {
  e.preventDefault();
  body.classList.remove('dragging');
  
  fileInput.files = e.dataTransfer.files;
});
body {
  font-family: Roboto, sans-serif;
}

body.dragging::before {
  content: "Drop the file(s) anywhere on this page";
  position: fixed;
  left: 0; width: 100%;
  top: 0; height: 100%;
  display: flex;
  justify-content: center;
  align-items: center;
  font-size: 1.5em;
  background-color: rgba(255, 255, 0, .3);
  pointer-events: none;
}

button, input {
  font-family: inherit;
}

a {
  color: blue;
}
<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width">
      <link href="https://fonts.googleapis.com/css?family=Roboto:400,400i,700" rel="stylesheet"> 

  <title>JS Bin</title>
</head>
<body>
  
  <h1>Drag and drop files into file input</h1>
  
  <p><small>Supported in <a href="https://github.com/whatwg/html/issues/2861">WebKit and Blink</a>. To test, drag and drop one or more files from your operating system onto this page.</small></p>
  
  <p>
    <input type="file">
  </p>

</body>
</html>


참고 사항:

이 작업은 기존 시스템이 있는 경우에만 수행할 수 있습니다.FileList오어dataTransfersetter 메서드에서 일반 텍스트 문자열을 허용하지 않으므로 입력 파일 요소에 설정할 수 있는 개체입니다.

자세한 정보는 여기서 Kaiido의 답변을 참조하십시오.파일이 FormData 객체에도 반영되는 FileList 객체에서 File 객체와 length 속성을 설정하는 방법?


이제 원래 질문에 답하려면 다음과 같이 간단해야 합니다.

document.querySelector('.preview-image-instruction')
    .addEventListener('drop', (ev) => {
        ev.preventDefault();
        document.querySelector('.image-url').files = ev.dataTransfer.files;
    });

언급URL : https://stackoverflow.com/questions/47515232/how-to-set-file-input-value-when-dropping-file-on-page

반응형