You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					54 lines
				
				1.3 KiB
			
		
		
			
		
	
	
					54 lines
				
				1.3 KiB
			| 
								 
											3 years ago
										 
									 | 
							
								'use strict';
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								import AxiosError from '../core/AxiosError.js';
							 | 
						||
| 
								 | 
							
								import parseProtocol from './parseProtocol.js';
							 | 
						||
| 
								 | 
							
								import platform from '../platform/index.js';
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								const DATA_URL_PATTERN = /^(?:([^;]+);)?(?:[^;]+;)?(base64|),([\s\S]*)$/;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/**
							 | 
						||
| 
								 | 
							
								 * Parse data uri to a Buffer or Blob
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * @param {String} uri
							 | 
						||
| 
								 | 
							
								 * @param {?Boolean} asBlob
							 | 
						||
| 
								 | 
							
								 * @param {?Object} options
							 | 
						||
| 
								 | 
							
								 * @param {?Function} options.Blob
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * @returns {Buffer|Blob}
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								export default function fromDataURI(uri, asBlob, options) {
							 | 
						||
| 
								 | 
							
								  const _Blob = options && options.Blob || platform.classes.Blob;
							 | 
						||
| 
								 | 
							
								  const protocol = parseProtocol(uri);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  if (asBlob === undefined && _Blob) {
							 | 
						||
| 
								 | 
							
								    asBlob = true;
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  if (protocol === 'data') {
							 | 
						||
| 
								 | 
							
								    uri = protocol.length ? uri.slice(protocol.length + 1) : uri;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    const match = DATA_URL_PATTERN.exec(uri);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    if (!match) {
							 | 
						||
| 
								 | 
							
								      throw new AxiosError('Invalid URL', AxiosError.ERR_INVALID_URL);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    const mime = match[1];
							 | 
						||
| 
								 | 
							
								    const isBase64 = match[2];
							 | 
						||
| 
								 | 
							
								    const body = match[3];
							 | 
						||
| 
								 | 
							
								    const buffer = Buffer.from(decodeURIComponent(body), isBase64 ? 'base64' : 'utf8');
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    if (asBlob) {
							 | 
						||
| 
								 | 
							
								      if (!_Blob) {
							 | 
						||
| 
								 | 
							
								        throw new AxiosError('Blob is not supported', AxiosError.ERR_NOT_SUPPORT);
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      return new _Blob([buffer], {type: mime});
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    return buffer;
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  throw new AxiosError('Unsupported protocol ' + protocol, AxiosError.ERR_NOT_SUPPORT);
							 | 
						||
| 
								 | 
							
								}
							 |