2010-01-28 12 views
48

मैं वर्तमान में Google क्रोम के लिए एक एक्सटेंशन बना रहा हूं जो हार्डड्राइव पर छवियों के सभी छवियों या लिंक को सहेज सकता है।क्रोम एक्सटेंशन: डिस्क पर फ़ाइल को कैसे सहेजें

समस्या यह है कि मुझे नहीं पता कि जेएस या Google क्रोम एक्सटेंशन API के साथ डिस्क पर फ़ाइल को कैसे सहेजना है।

क्या आपको कोई विचार है?

उत्तर

27

Download API का उपयोग कर डिस्क पर लिखने के लिए आपका उपयोग कर सकते हैं। डिस्क पर फ़ाइलों को डाउनलोड करने का यही एकमात्र तरीका है और यह सीमित है।

आप एनपीएपीआई प्लगइन पर एक नज़र डाल सकते हैं। आपको जो चाहिए वह करने का एक और तरीका एक्सएचआर पोस्ट के माध्यम से बाहरी वेबसाइट पर एक अनुरोध भेजना है और उसके बाद फाइल को वापस पुनर्प्राप्त करने के लिए एक और जीईटी अनुरोध है जो एक सेव फाइल डायलॉग के रूप में दिखाई देगा।

उदाहरण के लिए, मेरे ब्राउज़र एक्सटेंशन My Hangouts के लिए मैंने HTML5 कैनवास से सीधे डिस्क पर एक फोटो डाउनलोड करने के लिए उपयोगिता बनाई है। आप कोड यहाँ capture_gallery_downloader.js कोड है कि वह यह है कि करता है पर एक नज़र ले जा सकते हैं:

var url = window.webkitURL || window.URL || window.mozURL || window.msURL; 
var a = document.createElement('a'); 
a.download = 'MyHangouts-MomentCapture.jpg'; 
a.href = url.createObjectURL(dataURIToBlob(data.active, 'jpg')); 
a.textContent = 'Click here to download!'; 
a.dataset.downloadurl = ['jpg', a.download, a.href].join(':'); 

आप एचटीएमएल 5 में एक ब्लॉब करने के लिए एक यूआरआइ परिवर्तित करने के कार्यान्वयन चाहते हैं, तो यहाँ है कैसे मैंने किया:

/** 
* Converts the Data Image URI to a Blob. 
* 
* @param {string} dataURI base64 data image URI. 
* @param {string} mimetype the image mimetype. 
*/ 
var dataURIToBlob = function(dataURI, mimetype) { 
    var BASE64_MARKER = ';base64,'; 
    var base64Index = dataURI.indexOf(BASE64_MARKER) + BASE64_MARKER.length; 
    var base64 = dataURI.substring(base64Index); 
    var raw = window.atob(base64); 
    var rawLength = raw.length; 
    var uInt8Array = new Uint8Array(rawLength); 

    for (var i = 0; i < rawLength; ++i) { 
    uInt8Array[i] = raw.charCodeAt(i); 
    } 

    var bb = new this.BlobBuilder(); 
    bb.append(uInt8Array.buffer); 
    return bb.getBlob(mimetype); 
}; 

फिर उपयोगकर्ता डाउनलोड बटन पर क्लिक करने के बाद, यह फ़ाइल में ब्लॉब यूआरआई डाउनलोड करने के लिए "डाउनलोड" एचटीएमएल 5 फ़ाइल एपीआई का उपयोग करेगा।

+0

पर काम करता है यह पहली बार नहीं है जब हम मुझे एनपीएपीआई पर रीडायरेक्ट कर रहे हैं। मैं इस पर एक नज़र डालूँगा। आपकी मदद के लिए धन्यवाद –

+5

ध्यान दें कि यदि आप Google की गैलरी में एक्सटेंशन अपलोड करने की योजना बना रहे हैं, तो एनपीएपीआई का उपयोग करके आपके प्रकाशन में उनकी लंबी अवधि के लिए देरी होगी और यह स्वीकार नहीं किया जा सकता है। –

+0

मैं मैक्स से सहमत हूं। प्रकाशन में देरी होगी क्योंकि इसकी मैन्युअल रूप से समीक्षा की जाएगी। यह सबसे अच्छा होगा यदि आपके पास बाहरी सर्वर है जिसे आप अपने एक्सटेंशन में एक्सेस दे सकते हैं और POST के माध्यम से डेटा अपलोड कर सकते हैं और इसे उचित हेडर के साथ GET के माध्यम से वापस ला सकते हैं। –

-2

चूंकि जावास्क्रिप्ट आपके कंप्यूटर पर लगभग से कहीं भी से वेबपृष्ठों के साथ छेड़छाड़ करता है, इसलिए यह आपकी डिस्क पर लिखने की क्षमता देना खतरनाक होगा।

इसकी अनुमति नहीं है। क्या आप सोच रहे हैं कि क्रोम एक्सटेंशन को उपयोगकर्ता इंटरैक्शन की आवश्यकता होगी? अन्यथा यह एक ही श्रेणी में पड़ सकता है।

5

कोई तरीका नहीं है कि मैं चुपचाप फ़ाइलों को उपयोगकर्ता के ड्राइव में सहेजने के बारे में जानता हूं, ऐसा लगता है कि आप ऐसा करने की उम्मीद कर रहे हैं। मुझे लगता है कि आप फ़ाइलों के लिए पूछ सकते हैं एक समय में एक बचाया जा (हर बार उपयोगकर्ता को संकेत) की तरह कुछ का उपयोग कर:

function saveAsMe (filename) 
{ 
document.execCommand('SaveAs',null,filename) 
} 

आप केवल उपयोगकर्ता एक बार संकेत करने के लिए करना चाहता था, तो आप चुपचाप सभी छवियों को हड़पने सकता है, उन्हें एक बंडल में ज़िप करें, फिर उपयोगकर्ता को डाउनलोड करें। इसका मतलब यह हो सकता है कि सभी फ़ाइलों पर XmlHttpRequest करना, उन्हें जावास्क्रिप्ट में ज़िप करना, उन्हें एक स्टेजिंग क्षेत्र में अपलोड करना, और फिर उपयोगकर्ता से पूछना कि वे ज़िप फ़ाइल डाउनलोड करना चाहते हैं। बेतुका लगता है, मुझे पता है।

ब्राउज़र में स्थानीय संग्रहण विकल्प हैं, लेकिन वे केवल जहां तक ​​मुझे पता है, सैंडबॉक्स के भीतर डेवलपर के उपयोग के लिए हैं। (उदाहरण के लिए जीमेल ऑफलाइन कैशिंग।) Google से हालिया घोषणाएं जैसे this one

+12

केवल इंटरनेट एक्सप्लोरर –

3

HTML5 FileSystem features का उपयोग करने पर विचार करें जो जावास्क्रिप्ट का उपयोग कर फ़ाइलों को संभव बनाते हैं।

3

Google Webstore
Github

मैं एक विस्तार है, तो यहां किसी को अब भी दिलचस्पी है कि, कुछ इस तरह करता है बनाया है। यह ऑब्जेक्ट को पकड़ने के लिए XMLHTTPRequest का उपयोग करता है, जो इस मामले में एक छवि होने के लिए माना जाता है, फिर उस ऑब्जेक्ट URL को उस ऑब्जेक्ट यूआरएल का लिंक बनाता है, और काल्पनिक लिंक पर क्लिक करता है।

+0

रसपुतिन? अच्छा ... – chb

+0

पहला लिंक 404 – therealprashant

18

मैं लंबे समय से डाउनलोड छवियों को बैच करने के लिए क्रोम एक्सटेंशन बनाना चाहता था। फिर भी हर बार मैं निराश हो गया क्योंकि एकमात्र प्रतीत होता है कि लागू एनपीएपीआई है, जो क्रोम और फ़ायरफ़ॉक्स दोनों अब तक समर्थन करने की इच्छा नहीं रखते हैं।

मैं उन लोगों को सुझाव देता हूं जो इस पोस्ट के नीचे टिप्पणी Stackoverflow post पर देखने के लिए 'सेव-फाइल-ऑन-डिस्क' कार्यक्षमता को लागू करना चाहते हैं, तो मुझे इस पोस्ट के नीचे टिप्पणी बहुत मददगार है।

क्रोम 31+ के बाद से, chrome.downloads एपीआई स्थिर हो गया। हम इसे प्रोग्रामेटिक रूप से फ़ाइल डाउनलोड करने के लिए उपयोग कर सकते हैं। यदि उपयोगकर्ता ने क्रोम सेटिंग में ask me before every download अग्रिम विकल्प सेट नहीं किया है, तो हम पुष्टि करने के लिए उपयोगकर्ता को सूचित किए बिना फ़ाइल सहेज सकते हैं!

यहाँ है कि मैं क्या (विस्तार के पृष्ठभूमि पृष्ठ पर) का उपयोग है:

// remember to add "permissions": ["downloads"] to manifest.json 
    // this snippet is inside a onMessage() listener function 
    var imgurl = "https://www.google.com.hk/images/srpr/logo11w.png"; 
    chrome.downloads.download({url:imgurl},function(downloadId){ 
     console.log("download begin, the downId is:" + downloadId); 
    }); 

हालांकि यह एक दया है कि अभी भी क्रोम जब डाउनलोड पूरा एक Event प्रदान नहीं करता है। जब डाउनलोड begin सफलतापूर्वक (पर पूरा नहीं) chrome.downloads.download के कॉलबैक फ़ंक्शन कहा जाता है

आधिकारिक दस्तावेज़ के बारे में chrome.downloadshere है।

यह समाधान के बारे में मेरा मूल विचार नहीं है, लेकिन मैंने यहां उम्मीद की है कि यह किसी के लिए कुछ उपयोग हो सकता है।

+1

हिट करता है 2014 के बारे में नहीं पता लेकिन आज के रूप में 'ऑन चेंजेड' घटना को सुनना संभव है जो 'राज्य' ऑब्जेक्ट धारण करता है जो डाउनलोड की स्थिति बता सकता है (उदाहरण के लिए "पूर्ण")। – JSmyth

+1

@ एलन, रे "* हम पुष्टि करने के लिए उपयोगकर्ता को सूचित किए बिना फ़ाइल को सहेज सकते हैं *"; लेकिन जब आप उपयोगकर्ता की मशीन पर फाइल लिखना शुरू करते हैं तो नीचे "डाउनलोड बार" खोला नहीं जाएगा? क्या यह चुपचाप करने का कोई तरीका है? (उदाहरण के लिए, यदि आप पृष्ठभूमि में उपयोगकर्ता की मशीन पर 50 फाइलें लिख रहे हैं) – Pacerier

+0

@Pacerier यह कॉल शेल्फ डाउनलोड करता है, जब मैंने जवाब लिखा, मुझे याद है कि मुझे शेल्फ को मैन्युअल रूप से अग्रिम विकल्प पृष्ठ में दिखाने से अक्षम करना होगा। मैं कुछ खोज करता हूं, मुझे यह पता चला: आप शायद दिलचस्प हो।'setShelfEnabled' 'chrome.downloads.setShelfEnabled (बूलियन सक्षम)' वर्तमान ब्राउज़र प्रोफ़ाइल से जुड़े प्रत्येक विंडो के नीचे ग्रे शेल्फ को सक्षम या अक्षम करें। शेल्फ को तब तक अक्षम कर दिया जाएगा जब तक कि कम से कम एक एक्सटेंशन ने इसे अक्षम कर दिया हो। कम से कम एक अन्य एक्सटेंशन अक्षम होने पर शेल्फ को सक्षम करने से यह runtime.lastError के माध्यम से एक त्रुटि लौटाएगा। –

संबंधित मुद्दे