blueimp-load-image
Version:
JavaScript Load Image is a library to load images provided as File or Blob objects or via URL. It returns an optionally scaled, cropped or rotated HTML img or canvas element. It also provides methods to parse image metadata to extract IPTC and Exif tags a
107 lines (102 loc) • 3.06 kB
JavaScript
/*
* JavaScript Load Image Fetch
* https://github.com/blueimp/JavaScript-Load-Image
*
* Copyright 2017, Sebastian Tschan
* https://blueimp.net
*
* Licensed under the MIT license:
* https://opensource.org/licenses/MIT
*/
/* global define, module, require, Promise */
;(function (factory) {
'use strict'
if (typeof define === 'function' && define.amd) {
// Register as an anonymous AMD module:
define(['./load-image'], factory)
} else if (typeof module === 'object' && module.exports) {
factory(require('./load-image'))
} else {
// Browser globals:
factory(window.loadImage)
}
})(function (loadImage) {
'use strict'
var global = loadImage.global
if (
global.fetch &&
global.Request &&
global.Response &&
global.Response.prototype.blob
) {
loadImage.fetchBlob = function (url, callback, options) {
/**
* Fetch response handler.
*
* @param {Response} response Fetch response
* @returns {Blob} Fetched Blob.
*/
function responseHandler(response) {
return response.blob()
}
if (global.Promise && typeof callback !== 'function') {
return fetch(new Request(url, callback)).then(responseHandler)
}
fetch(new Request(url, options))
.then(responseHandler)
.then(callback)
[
// Avoid parsing error in IE<9, where catch is a reserved word.
// eslint-disable-next-line dot-notation
'catch'
](function (err) {
callback(null, err)
})
}
} else if (
global.XMLHttpRequest &&
// https://xhr.spec.whatwg.org/#the-responsetype-attribute
new XMLHttpRequest().responseType === ''
) {
loadImage.fetchBlob = function (url, callback, options) {
/**
* Promise executor
*
* @param {Function} resolve Resolution function
* @param {Function} reject Rejection function
*/
function executor(resolve, reject) {
options = options || {} // eslint-disable-line no-param-reassign
var req = new XMLHttpRequest()
req.open(options.method || 'GET', url)
if (options.headers) {
Object.keys(options.headers).forEach(function (key) {
req.setRequestHeader(key, options.headers[key])
})
}
req.withCredentials = options.credentials === 'include'
req.responseType = 'blob'
req.onload = function () {
resolve(req.response)
}
req.onerror =
req.onabort =
req.ontimeout =
function (err) {
if (resolve === reject) {
// Not using Promises
reject(null, err)
} else {
reject(err)
}
}
req.send(options.body)
}
if (global.Promise && typeof callback !== 'function') {
options = callback // eslint-disable-line no-param-reassign
return new Promise(executor)
}
return executor(callback, callback)
}
}
})