কিভাবে ফাইল টেনে আনতে হয়

এইচটিএমএল ড্র্যাগ অ্যান্ড ড্রপ ইন্টারফেস ওয়েব অ্যাপ্লিকেশনগুলোকে একটি ওয়েব পেজে ড্র্যাগ ও ড্রপ করা ফাইল গ্রহণ করতে সক্ষম করে। ড্র্যাগ অ্যান্ড ড্রপ অপারেশনের সময়, ড্র্যাগ করা ফাইল এবং ডিরেক্টরি আইটেমগুলো যথাক্রমে ফাইল এন্ট্রি এবং ডিরেক্টরি এন্ট্রির সাথে যুক্ত হয়। ব্রাউজারে ফাইল ড্র্যাগ ও ড্রপ করার দুটি উপায় রয়েছে: আধুনিক এবং ক্লাসিক পদ্ধতি।

আধুনিক উপায়

ফাইল সিস্টেম অ্যাক্সেস API-এর DataTransferItem.getAsFileSystemHandle() পদ্ধতি ব্যবহার করে

DataTransferItem.getAsFileSystemHandle() মেথডটি ড্র্যাগ করা আইটেমটি একটি ফাইল হলে FileSystemFileHandle অবজেক্ট সহ একটি প্রমিজ রিটার্ন করে, এবং ড্র্যাগ করা আইটেমটি একটি ডিরেক্টরি হলে FileSystemDirectoryHandle অবজেক্ট সহ একটি প্রমিজ রিটার্ন করে। এই হ্যান্ডেলগুলো আপনাকে ফাইল বা ডিরেক্টরিতে রিড করতে এবং ঐচ্ছিকভাবে রাইট ব্যাক করতে দেয়। উল্লেখ্য যে, ড্র্যাগ অ্যান্ড ড্রপ ইন্টারফেসের DataTransferItem.kind ফাইল এবং ডিরেক্টরি উভয়ের জন্যই "file" হবে, যেখানে ফাইল সিস্টেম অ্যাক্সেস এপিআই-এর FileSystemHandle.kind ফাইলের জন্য "file" এবং ডিরেক্টরির জন্য "directory" হবে।

Browser Support

  • ক্রোম: ৮৬।
  • প্রান্ত: ৮৬।
  • ফায়ারফক্স সমর্থিত নয়।
  • সাফারি সমর্থিত নয়।

Source

ক্লাসিক উপায়

ক্লাসিক DataTransferItem.getAsFile() পদ্ধতি ব্যবহার করে

DataTransferItem.getAsFile() মেথডটি ড্র্যাগ ডেটা আইটেমের File অবজেক্টটি রিটার্ন করে। যদি আইটেমটি কোনো ফাইল না হয়, তবে এই মেথডটি null রিটার্ন করে। যদিও আপনি ফাইলটি পড়তে পারবেন, কিন্তু এতে আবার লেখার কোনো উপায় নেই। এই মেথডটির একটি অসুবিধা হলো এটি ডিরেক্টরি সাপোর্ট করে না।

Browser Support

  • ক্রোম: ১১।
  • প্রান্ত: ১২।
  • ফায়ারফক্স: ৫০।
  • সাফারি: ৫.১।

Source

প্রগতিশীল উন্নয়ন

নিচের কোড স্নিপেটটি আধুনিক ফাইল সিস্টেম অ্যাক্সেস এপিআই-এর DataTransferItem.getAsFileSystemHandle() মেথডটি ব্যবহার করে যখন এটি সমর্থিত থাকে, তারপর অ-মানক DataTransferItem.webkitGetAsEntry() মেথডে ফিরে যায়, এবং সবশেষে ক্লাসিক DataTransferItem.getAsFile() মেথডে ফিরে আসে। প্রতিটি handle ধরন অবশ্যই পরীক্ষা করে নেবেন, কারণ এটি নিম্নলিখিতগুলির মধ্যে যেকোনো একটি হতে পারে:

  • আধুনিক কোড পাথ বেছে নেওয়া হলে FileSystemFileHandle
  • ক্লাসিক কোড পাথ বেছে নেওয়া হলে File তৈরি হয়।

সব ধরনেরই একটি name প্রপার্টি থাকে, তাই এটি লগ করা ঠিক আছে এবং সবসময় কাজ করবে।

// Run feature detection.
const supportsFileSystemAccessAPI =
  'getAsFileSystemHandle' in DataTransferItem.prototype;

// This is the drag and drop zone.
const elem = document.querySelector('main');

  // Prevent navigation.
elem.addEventListener('dragover', (e) => {
  e.preventDefault();
});

// Visually highlight the drop zone.
elem.addEventListener('dragenter', (e) => {
  elem.style.outline = 'solid red 1px';
});

// Visually unhighlight the drop zone.
elem.addEventListener('dragleave', (e) => {
  elem.style.outline = '';
});

// This is where the drop is handled.
elem.addEventListener('drop', async (e) => {
  // Prevent navigation.
  e.preventDefault();
  // Unhighlight the drop zone.
  elem.style.outline = '';
  // Prepare an array of promises…
  const fileHandlesPromises = [...e.dataTransfer.items]
    // …by including only files (where file misleadingly means actual file _or_
    // directory)…
    .filter((item) => item.kind === 'file')
    // …and, depending on previous feature detection…
    .map((item) =>
      supportsFileSystemAccessAPI
        // …either get a modern `FileSystemHandle`…
        ? item.getAsFileSystemHandle()
        // …or a classic `File`.
        : item.getAsFile(),
    );
  // Loop over the array of promises.
  for await (const handle of fileHandlesPromises) {
    // This is where we can actually exclusively act on the files.
    if (handle.kind === 'file' || handle.isFile) {
      console.log(`File: ${handle.name}`);
    }
  }
});

আরও পড়ুন

ডেমো

এইচটিএমএল

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1" />
    <title>How to drag and drop files</title>
  </head>
  <body>
    <main>
      <h1>How to drag and drop files</h1>
      <p>Drag and drop one or multiple files onto the page.</p>
      <pre></pre>
    </main>
  </body>
</html>

সিএসএস


        :root {
  color-scheme: dark light;
  box-sizing: border-box;
}

*,
*:before,
*:after {
  box-sizing: inherit;
}

body {
  margin: 0;
  padding: 1rem;
  font-family: system-ui, sans-serif;
  line-height: 1.5;
  min-height: 100vh;
  display: flex;
  flex-direction: column;
}

img,
video {
  height: auto;
  max-width: 100%;
}

main {
  flex-grow: 1;
}

footer {
  margin-top: 1rem;
  border-top: solid CanvasText 1px;
  font-size: 0.8rem;
}
        

জেএস


        const supportsFileSystemAccessAPI =
  "getAsFileSystemHandle" in DataTransferItem.prototype;
const supportsWebkitGetAsEntry =
  "webkitGetAsEntry" in DataTransferItem.prototype;

const elem = document.querySelector("main");
const debug = document.querySelector("pre");

elem.addEventListener("dragover", (e) => {
  // Prevent navigation.
  e.preventDefault();
});

elem.addEventListener("dragenter", (e) => {
  elem.style.outline = "solid red 1px";
});

elem.addEventListener("dragleave", (e) => {
  elem.style.outline = "";
});

elem.addEventListener("drop", async (e) => {
  e.preventDefault();
  elem.style.outline = "";
  const fileHandlesPromises = [...e.dataTransfer.items]
    .filter((item) => item.kind === "file")
    .map((item) =>
      supportsFileSystemAccessAPI
        ? item.getAsFileSystemHandle()
        : supportsWebkitGetAsEntry
        ? item.webkitGetAsEntry()
        : item.getAsFile()
    );

  for await (const handle of fileHandlesPromises) {
    if (handle.kind === "directory" || handle.isDirectory) {
      console.log(`Directory: ${handle.name}`);
      debug.textContent += `Directory: ${handle.name}\n`;
    } else {
      console.log(`File: ${handle.name}`);
      debug.textContent += `File: ${handle.name}\n`;
    }
  }
});