Skip to content

Instantly share code, notes, and snippets.

@daimagine
Created April 15, 2019 06:12
Show Gist options
  • Select an option

  • Save daimagine/cb3c6e75011b340f878452b243241abb to your computer and use it in GitHub Desktop.

Select an option

Save daimagine/cb3c6e75011b340f878452b243241abb to your computer and use it in GitHub Desktop.

Revisions

  1. daimagine revised this gist Apr 15, 2019. 1 changed file with 1 addition and 1 deletion.
    2 changes: 1 addition & 1 deletion download-blob.js
    Original file line number Diff line number Diff line change
    @@ -8,7 +8,7 @@ const downloadBlob = (
    mime = 'application/octet-stream'
    ) => {
    if (window && result && result.data) {
    message.log('download blob', result, false)
    console.log('download blob', result, false)

    // get filename
    const disposition = result.headers['content-disposition']
  2. daimagine created this gist Apr 15, 2019.
    77 changes: 77 additions & 0 deletions download-blob.js
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,77 @@
    // 'download-blob.js', inspired by this gist:
    // 'dreamyguy/downloadFile.js' https://gist.github.com/dreamyguy/6b4ab77d2f118adb8a63c4a03fba349d
    // I added some handler to make it works in Chrome, Safari, and Firefox on iOS

    const downloadBlob = (
    result,
    defaultFilename = 'content.dat',
    mime = 'application/octet-stream'
    ) => {
    if (window && result && result.data) {
    message.log('download blob', result, false)

    // get filename
    const disposition = result.headers['content-disposition']
    const filenameRegex = /filename[^;=\n]*=((['"]).*?\2|[^;\n]*)/
    const matches = filenameRegex.exec(disposition)
    const filename = (matches != null && matches[1])
    ? decodeURIComponent(matches[1].replace(/['"]/g, ''))
    : defaultFilename

    // extract user agent
    const userAgent = window.navigator.userAgent.toLowerCase()
    const ios = /iphone|ipod|ipad|crios|fxios/.test(userAgent)
    const chrome = /crios/.test(userAgent)

    // create blob
    // It is necessary to create a new blob object with mime-type explicitly set
    // otherwise only Chrome works like it should
    const blob = new Blob([result.data], { type: mime })
    const blobURL = window.URL.createObjectURL(blob)

    // if its ipad or iphone
    if (ios) {
    var reader = new FileReader()
    reader.onload = () => {
    if (chrome) {
    window.open(blobURL)
    } else {
    window.location.href = blobURL
    }
    }
    reader.readAsDataURL(blob)
    return
    }

    if (typeof window.navigator.msSaveBlob !== 'undefined') {
    // IE doesn't allow using a blob object directly as link href.
    // Workaround for "HTML7007: One or more blob URLs were
    // revoked by closing the blob for which they were created.
    // These URLs will no longer resolve as the data backing
    // the URL has been freed."
    window.navigator.msSaveBlob(blob, filename)
    return
    }

    // Other browsers
    // Create a link pointing to the ObjectURL containing the blob
    const link = document.createElement('a')
    link.href = blobURL
    link.style.display = 'none'
    link.setAttribute('download', filename)
    // Safari thinks _blank anchor are pop ups. We only want to set _blank
    // target if the browser does not support the HTML5 download attribute.
    // This allows you to download files in desktop safari if pop up blocking
    // is enabled.
    if (typeof link.download === 'undefined') {
    link.setAttribute('target', '_blank')
    }
    document.body.appendChild(link)
    link.click()
    document.body.removeChild(link)
    setTimeout(() => {
    // For Firefox it is necessary to delay revoking the ObjectURL
    window.URL.revokeObjectURL(blobURL)
    }, 100)
    }
    }