Sign Up

Sign Up to our social questions and Answers Engine to ask questions, answer people’s questions, and connect with other people.

Have an account? Sign In

Have an account? Sign In Now

Sign In

Login to our social questions & Answers Engine to ask questions answer people’s questions & connect with other people.

Sign Up Here

Forgot Password?

Don't have account, Sign Up Here

Forgot Password

Lost your password? Please enter your email address. You will receive a link and will create a new password via email.

Have an account? Sign In Now

You must login to ask a question.

Forgot Password?

Need An Account, Sign Up Here

Please briefly explain why you feel this question should be reported.

Please briefly explain why you feel this answer should be reported.

Please briefly explain why you feel this user should be reported.

Sign InSign Up

The Archive Base

The Archive Base Logo The Archive Base Logo

The Archive Base Navigation

  • SEARCH
  • Home
  • About Us
  • Blog
  • Contact Us
Search
Ask A Question

Mobile menu

Close
Ask a Question
  • Home
  • Add group
  • Groups page
  • Feed
  • User Profile
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Buy Points
  • Users
  • Help
  • Buy Theme
  • SEARCH
Home/ Questions/Q 7041939
In Process

The Archive Base Latest Questions

Editorial Team
  • 0
Editorial Team
Asked: May 28, 20262026-05-28T02:06:28+00:00 2026-05-28T02:06:28+00:00

First of all there is a question with the same title here on SO

  • 0

First of all there is a question with the same title here on SO but its not what I’m looking for and it doesn’t have a complete answer either.

So here’s my question. Say I have this URL which directs to an image.

https://fbcdn-photos-a.akamaihd.net/hphotos-ak-ash4/299595_10150290138650735_543370734_8021370_355110168_n.jpg

Once I put this parameter ?dl=1 to the end of the URL, it becomes downloadable.

https://fbcdn-photos-a.akamaihd.net/hphotos-ak-ash4/299595_10150290138650735_543370734_8021370_355110168_n.jpg?dl=1

I’m trying to do this task through a userscript. So I used XMLHttpRequest for that.

var url = "https://fbcdn-photos-a.akamaihd.net/hphotos-ak-ash4/299595_10150290138650735_543370734_8021370_355110168_n.jpg?dl=1";

var request = new XMLHttpRequest();  
request.open("GET", url, false);   
request.send(null);  

if (request.status === 200) 
{  
    alert(request.statusText);
}

Here is a fiddle.

But it does not work.

  • 1 1 Answer
  • 0 Views
  • 0 Followers
  • 0
Share
  • Facebook
  • Report

Leave an answer
Cancel reply

You must login to add an answer.

Forgot Password?

Need An Account, Sign Up Here

1 Answer

  • Voted
  • Oldest
  • Recent
  • Random
  1. Editorial Team
    Editorial Team
    2026-05-28T02:06:29+00:00Added an answer on May 28, 2026 at 2:06 am

    XMLHttpRequest will not work cross-domain, but since this is a userscript Chrome now supports GM_xmlhttpRequest() in userscripts only.

    Something like this should work, note that it is asynchronous:

    GM_xmlhttpRequest ( {
        method:         'GET',
        url:            'https://fbcdn-photos-a.akamaihd.net/hphotos-ak-ash4/299595_10150290138650735_543370734_8021370_355110168_n.jpg?dl=1',
        onload:         function (responseDetails) {
                            alert(responseDetails.statusText);
                        }
    } );
    



    As for getting and using the actual image data, that is a major pain to work out.

    • You can use the new .responseType = "blob"; functionality in Firefox but Chrome does not yet support it.

    • In Chrome or Firefox, for the same domain only, you can use the new XHR2 like so:
      See it in action at jsBin.

      BlobBuilder             = window.MozBlobBuilder || window.WebKitBlobBuilder || window.BlobBuilder;
      
      var url                 = "http://jsbin.com/images/gear.png";
      var request             = new XMLHttpRequest();
      request.open ("GET", url, false);
      request.responseType    = "arraybuffer";
      request.send (null);
      
      if (request.status === 200) {
          var bb              = new BlobBuilder ();
          bb.append (request.response); // Note: not request.responseText
      
          var blob            = bb.getBlob ('image/png');
          var reader          = new FileReader ();
          reader.onload       = function (zFR_Event) {
              $("body").prepend ('<p>New image: <img src="' + zFR_Event.target.result + '"></p>')
          };
      
          reader.readAsDataURL (blob);
      }
      

    • Unfortunately, GM_xmlhttpRequest() does not (yet) support setting responseType.

    So, for GM script or userscript applications, we have to use a custom base64 encoding scheme like in “Javascript Hacks: Using XHR to load binary data”.

    The script code becomes something like:

    var imgUrl              = "http://jsbin.com/images/gear.png";
    
    GM_xmlhttpRequest ( {
        method:         'GET',
        url:            imgUrl,
        onload:         function (respDetails) {
                            var binResp     = customBase64Encode (respDetails.responseText);
    
                            /*-- Here, we just demo that we have a valid base64 encoding
                                by inserting the image into the page.
                                We could just as easily AJAX-off the data instead.
                            */
                            var zImgPara    = document.createElement ('p');
                            var zTargetNode = document.querySelector ("body *"); //1st child
    
                            zImgPara.innerHTML = 'Image: <img src="data:image/png;base64,'
                                               + binResp + '">';
                            zTargetNode.parentNode.insertBefore (zImgPara, zTargetNode);
                        },
        overrideMimeType: 'text/plain; charset=x-user-defined'
    } );
    
    
    function customBase64Encode (inputStr) {
        var
            bbLen               = 3,
            enCharLen           = 4,
            inpLen              = inputStr.length,
            inx                 = 0,
            jnx,
            keyStr              = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"
                                + "0123456789+/=",
            output              = "",
            paddingBytes        = 0;
        var
            bytebuffer          = new Array (bbLen),
            encodedCharIndexes  = new Array (enCharLen);
    
        while (inx < inpLen) {
            for (jnx = 0;  jnx < bbLen;  ++jnx) {
                /*--- Throw away high-order byte, as documented at:
                  https://developer.mozilla.org/En/Using_XMLHttpRequest#Handling_binary_data
                */
                if (inx < inpLen)
                    bytebuffer[jnx] = inputStr.charCodeAt (inx++) & 0xff;
                else
                    bytebuffer[jnx] = 0;
            }
    
            /*--- Get each encoded character, 6 bits at a time.
                index 0: first  6 bits
                index 1: second 6 bits
                            (2 least significant bits from inputStr byte 1
                             + 4 most significant bits from byte 2)
                index 2: third  6 bits
                            (4 least significant bits from inputStr byte 2
                             + 2 most significant bits from byte 3)
                index 3: forth  6 bits (6 least significant bits from inputStr byte 3)
            */
            encodedCharIndexes[0] = bytebuffer[0] >> 2;
            encodedCharIndexes[1] = ( (bytebuffer[0] & 0x3) << 4)   |  (bytebuffer[1] >> 4);
            encodedCharIndexes[2] = ( (bytebuffer[1] & 0x0f) << 2)  |  (bytebuffer[2] >> 6);
            encodedCharIndexes[3] = bytebuffer[2] & 0x3f;
    
            //--- Determine whether padding happened, and adjust accordingly.
            paddingBytes          = inx - (inpLen - 1);
            switch (paddingBytes) {
                case 1:
                    // Set last character to padding char
                    encodedCharIndexes[3] = 64;
                    break;
                case 2:
                    // Set last 2 characters to padding char
                    encodedCharIndexes[3] = 64;
                    encodedCharIndexes[2] = 64;
                    break;
                default:
                    break; // No padding - proceed
            }
    
            /*--- Now grab each appropriate character out of our keystring,
                based on our index array and append it to the output string.
            */
            for (jnx = 0;  jnx < enCharLen;  ++jnx)
                output += keyStr.charAt ( encodedCharIndexes[jnx] );
        }
        return output;
    }
    
    • 0
    • Reply
    • Share
      Share
      • Share on Facebook
      • Share on Twitter
      • Share on LinkedIn
      • Share on WhatsApp
      • Report

Sidebar

Related Questions

First of all there is a partial question regarding this, but it is not
First of all: I am not an experienced ClearCase user, but I have lots
I know, there are several posts with nearly the same question, but all the
First of all, my apologies for the title of this question, I don't have
First of all, I know how to build a Java application. But I have
First of all I'd welcome edits to the title of this question, I couldn't
First, I'm sorry for the question title but I can't think of a better
First of all, sorry for the too long question. I know that there are
The Disclaimer First of all, I know this question (or close variations) have been
I'm not sure how to title the question I have so I can't be

Explore

  • Home
  • Add group
  • Groups page
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Users
  • Help
  • SEARCH

Footer

© 2021 The Archive Base. All Rights Reserved
With Love by The Archive Base

Insert/edit link

Enter the destination URL

Or link to existing content

    No search term specified. Showing recent items. Search or use up and down arrow keys to select an item.