2012-05-28 54 views
3

背景故事如何從GreaseMonkey userscripts請求二進制文件?

我寫的目的是既的GreaseMonkey和谷歌Chrome中使用專門的圖像內襯腳本。它應該下載PNG文件並將它們存儲在data:的url中,圖像src屬性。這聽起來很荒謬,但是某個網站會爲圖像設置Content-Dispositionattachment,而且我不想每次都彈出「另存爲」對話框。

實際問題

腳本獲取數據與XMLHttpRequest,它編碼成一個適當的位置Base64和存儲。到目前爲止,很好。但是,只有當我通過Firebug和Chrome dev控制檯運行它時才起作用,而當我將它用作正確的用戶腳本時,它才起作用。據我所知,這是因爲Greasemonkey腳本不能直接使用XMLHttpRequest對象,而應該依靠調用GM_xmlhttpRequest來代替。但是,我不能將responseType設置爲"blob""arraybuffer"那樣,而binary參數似乎只適用於通過POST請求發送數據。我只得到Unicode字符串。

爲了以防萬一,圖像是從與鏈接到它們的頁面相同的域中提供的。我相信它符合「同源」的東西。

http://wiki.greasespot.net/GM_xmlhttpRequest這裏是GM_xmlhttpRequest文檔。

有沒有辦法從Greasemonkey userscript中獲取arraybuffer

+0

可能的重複[使用XMLHttpRequest在一個腳本中下載圖像](http://stackoverflow.com/questions/8778863/downloading-an-image-using-xmlhttprequest-in-a-userscript) –

回答

2

如果同域,那麼你可以使用XMLHttpRequest,沒有任何問題。使用GM_xmlhttpRequest(目前有一個殘缺的功能子集)的唯一原因是圖像/文件是跨域。

對於同域,可以使用XHR2,如this answer所示。

對於跨域,您必須:使用GM_xmlhttpRequest,覆蓋MIME類型,並使用自定義編碼器算法。再次,這全部顯示在that same answer中。


然而,這聽起來像你只是想更容易地下載圖像?如果是這樣,那麼只需使用優秀的DownThemAll extension即可。

+0

謝謝! Chrome不允許爲同步請求('open(,, false)')設置'responseType',並且異步請求由於某種原因不起作用(它永遠不會調用'onload'),但它在Greasemonkey中有效。 –

+0

我正在嘗試將圖像內嵌到某個網站的頁面上,因此僅爲一個網站使用擴展程序對我來說不是一種選擇。 –

0

overrideMimeType字符串(兼容性:0.6.8+)可選。 MIME類型 用於指定請求(例如「text/html; charset = ISO-8859-1」)。

您可以將其設置爲plain/text; charset=x-user-defined(類型並不重要,但字符集一樣),按位並通過響應字符串和值添加到一個類型數組,並得到緩衝:

var text = xhr.responseText, 
    len = text.length, 
    arr = new Uint8Array(len), 
    i = 0; 

    for(i = 0; i < len; ++i) { 
     arr[i] = text.charCodeAt(i) & 0xFF; 
    } 

    arr.buffer //The arraybuffer 

注意:這是針對原始二進制響應,而不是base64。

相關問題