फ़ाइल सेव करने का तरीका

थॉमस स्टाइनर
थॉमस स्टाइनर

फ़ाइलों से जुड़ी कार्रवाई करना, वेब पर ऐप्लिकेशन के लिए सबसे आम कार्रवाइयों में से एक है. आम तौर पर, उपयोगकर्ताओं को कोई फ़ाइल अपलोड करके उसमें कुछ बदलाव करने होते थे और उसे फिर से डाउनलोड करना पड़ता था, ताकि डाउनलोड फ़ोल्डर में एक कॉपी बन जाए. File System Access API से, अब उपयोगकर्ता फ़ाइलों को सीधे खोल सकते हैं, उनमें बदलाव कर सकते हैं, और बदलावों को ओरिजनल फ़ाइल में सेव कर सकते हैं.

फ़ाइल सेव करने के लिए, showSaveFilePicker() पर कॉल करें. इससे FileSystemFileHandle का प्रॉमिस मिलता है. आपके पास जिस फ़ाइल का नाम है उसे { suggestedName: 'example.txt' } के तौर पर इस्तेमाल किया जा सकता है.

ब्राउज़र सहायता

  • 86
  • 86
  • x
  • x

सोर्स

क्लासिक तरीका

<a download> एलिमेंट का इस्तेमाल करना

पेज पर <a download> एलिमेंट, लोगों को पेज पर क्लिक करने और फ़ाइल डाउनलोड करने की सुविधा देता है. अब इस तरकीब में, JavaScript वाले पेज में एलिमेंट को इंजेस्ट करना और प्रोग्राम के हिसाब से उस पर क्लिक करना शामिल है.

ब्राउज़र सहायता

  • 15
  • 13
  • 20
  • 10.1

सोर्स

प्रोग्रेसिव एन्हैंसमेंट

नीचे दिए गए तरीके के साथ फ़ाइल सिस्टम ऐक्सेस एपीआई काम करता है, जबकि इसके बाद क्लासिक वर्शन का इस्तेमाल किया जाता है. दोनों ही मामलों में फ़ंक्शन, फ़ाइल को सेव करता है. हालांकि, अगर File System Access API काम करता है, तो उपयोगकर्ता को फ़ाइल सेव करने का एक डायलॉग मिलेगा. यहां वे चुन सकते हैं कि फ़ाइल कहां सेव की जाए.

const saveFile = async (blob, suggestedName) => {
 
// Feature detection. The API needs to be supported
 
// and the app not run in an iframe.
 
const supportsFileSystemAccess =
   
'showSaveFilePicker' in window &&
   
(() => {
     
try {
       
return window.self === window.top;
     
} catch {
       
return false;
     
}
   
})();
 
// If the File System Access API is supported…
 
if (supportsFileSystemAccess) {
   
try {
     
// Show the file save dialog.
     
const handle = await showSaveFilePicker({
        suggestedName
,
     
});
     
// Write the blob to the file.
     
const writable = await handle.createWritable();
      await writable
.write(blob);
      await writable
.close();
     
return;
   
} catch (err) {
     
// Fail silently if the user has simply canceled the dialog.
     
if (err.name !== 'AbortError') {
        console
.error(err.name, err.message);
       
return;
     
}
   
}
 
}
 
// Fallback if the File System Access API is not supported…
 
// Create the blob URL.
 
const blobURL = URL.createObjectURL(blob);
 
// Create the `<a download>` element and append it invisibly.
 
const a = document.createElement('a');
  a
.href = blobURL;
  a
.download = suggestedName;
  a
.style.display = 'none';
  document
.body.append(a);
 
// Programmatically click the element.
  a
.click();
 
// Revoke the blob URL and remove the element.
  setTimeout
(() => {
    URL
.revokeObjectURL(blobURL);
    a
.remove();
 
}, 1000);
};

इसके बारे में और पढ़ें

डेमो

<!DOCTYPE html>
<html lang="en">
 
<head>
   
<meta charset="utf-8" />
   
<meta name="viewport" content="width=device-width, initial-scale=1" />
    <link
      rel="icon"
      href="data:image/svg+xml,
<svg xmlns=%22http://www.w3.org/2000/svg%22 viewBox=%220 0 100 100%22><text y=%22.9em%22 font-size=%2290%22>🎉</text></svg>"
    />
   
<title>How to save a file</title>
 
</head>
 
<body>
   
<h1>How to save a file</h1>

   
<label
     
>Text to save
     
<textarea rows="3">
Some sample text for you to save. Feel free to edit this.
</textarea
     
>
   
</label>
   
<label>File name <input class="text" value="example.txt" /></label>
   
<button class="text" type="button">Save text</button>

   
<label
     
>Image to save
     
<img
       
src="https://cdn.glitch.global/75170424-3d76-41d7-ae77-72d0efb0401b/AVIF%20Test%20picture%20(JPEG%20converted%20to%20AVIF%20with%20Convertio).avif?v=1658240752363"
       
alt="Blue flower."
       
width="630"
       
height="420"
   
/></label>
   
<label>File name <input class="img" value="example.avif" /></label>
   
<button class="img" type="button">Save image</button>
 
</body>
</html>

       
:root {
 
color-scheme: dark light;
}

html
{
 
box-sizing: border-box;
}

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

body
{
 
margin: 1rem;
 
font-family: system-ui, sans-serif;
}

img
{
 
max-width: 320px;
 
height: auto;
}

label
,
button
,
textarea
,
input
,
img
{
 
display: block;
 
margin-block: 1rem;
}
       

       
const textarea = document.querySelector('textarea');
const textInput = document.querySelector('input.text');
const textButton = document.querySelector('button.text');

const img = document.querySelector('img');
const imgInput = document.querySelector('input.img');
const imgButton = document.querySelector('button.img');

const saveFile = async (blob, suggestedName) => {
 
// Feature detection. The API needs to be supported
 
// and the app not run in an iframe.
 
const supportsFileSystemAccess =
   
'showSaveFilePicker' in window &&
   
(() => {
     
try {
       
return window.self === window.top;
     
} catch {
       
return false;
     
}
   
})();
 
// If the File System Access API is supported…
 
if (supportsFileSystemAccess) {
   
try {
     
// Show the file save dialog.
     
const handle = await showSaveFilePicker({
        suggestedName
,
     
});
     
// Write the blob to the file.
     
const writable = await handle.createWritable();
      await writable
.write(blob);
      await writable
.close();
     
return;
   
} catch (err) {
     
// Fail silently if the user has simply canceled the dialog.
     
if (err.name !== 'AbortError') {
        console
.error(err.name, err.message);
       
return;
     
}
   
}
 
}
 
// Fallback if the File System Access API is not supported…
 
// Create the blob URL.
 
const blobURL = URL.createObjectURL(blob);
 
// Create the `` element and append it invisibly.
 
const a = document.createElement('a');
  a
.href = blobURL;
  a
.download = suggestedName;
  a
.style.display = 'none';
  document
.body.append(a);
 
// Click the element.
  a
.click();
 
// Revoke the blob URL and remove the element.
  setTimeout
(() => {
    URL
.revokeObjectURL(blobURL);
    a
.remove();
 
}, 1000);
};

textButton
.addEventListener('click', async () => {
 
const blob = new Blob([textarea.value], { type: 'text/plain' });
  await saveFile
(blob, textInput.value);
});

imgButton
.addEventListener('click', async () => {
 
const blob = await fetch(img.src).then((response) => response.blob());
  await saveFile
(blob, imgInput.value);
});
       

जब तक कुछ अलग से न बताया जाए, तब तक इस पेज की सामग्री को Creative Commons Attribution 4.0 License के तहत और कोड के नमूनों को Apache 2.0 License के तहत लाइसेंस मिला है. ज़्यादा जानकारी के लिए, Google Developers साइट नीतियां देखें. Oracle और/या इससे जुड़ी हुई कंपनियों का, Java एक रजिस्टर किया हुआ ट्रेडमार्क है.

आखिरी बार 2023-10-25 (UTC) को अपडेट किया गया.