## Pure Vanilla Javascript download and upload functions for Apache Cordova The cordova plugin `cordova-plugin-file-transfer` is [due to be deprecated](https://cordova.apache.org/blog/2017/10/18/from-filetransfer-to-xhr2.html) and its latest [npm version fails on iOS](https://github.com/apache/cordova-plugin-file-transfer/issues/297). Therefore these two working functions are purely based on JS, and thus no need to use extra plugins, besides the standard plugin `cordova-plugin-file`. Therefore this is compatible with any platform. ```js // for different types of cordovaFileSystem check here: // https://cordova.apache.org/docs/en/latest/reference/cordova-plugin-file/#where-to-store-files // or simply type in the console `console.log(cordova.file)` function downloadFileToDevice (fileurl, filename, cordovaFileSystem, callback) { var onerror = (err) => { console.error(`Error downloading from ${fileurl} to cordovaFileSystem ${cordovaFileSystem}`, err, new Error(err)) if (typeof callback === 'function') { callback(Error(err)) } } var blob = null var xhr = new XMLHttpRequest() xhr.open('GET', fileurl) xhr.responseType = 'blob' // force the HTTP response, response-type header to be blob xhr.onload = () => { blob = xhr.response // xhr.response is now a blob object var DataBlob = blob window.resolveLocalFileSystemURL(cordovaFileSystem, (dirEntry) => { const sanitizedFilename = filename.replace(/[^a-z0-9\.]/gi, '_').toLowerCase() // sanitize filename dirEntry.getFile(sanitizedFilename, { create: true }, (file) => { file.createWriter((fileWriter) => { fileWriter.write(DataBlob) if (typeof callback === 'function') { callback(null, cordovaFileSystem + sanitizedFilename) } }, (err) => { console.error('Error on file.createWriter'); onerror(err) }) }, (err) => { console.error('Error on dirEntry.getFile'); onerror(err) }) }, (err) => { console.error('Error on resolveLocalFileSystemURL'); onerror(err) }) } xhr.onerror = (err) => { console.error('Error on XMLHttpRequest'); onerror(err) } xhr.send() } ``` ```js function uploadFileToServer (fileUri, fileName, remoteUrl, callback) { var onerror = (err) => { console.error(`Error uploading file ${fileUri} to ${remoteUrl}`, err, new Error(err)) if (typeof callback === 'function') { callback(Error(err)) } } window.resolveLocalFileSystemURL(fileUri, function (fileEntry) { fileEntry.file((file) => { if (!file.size) { onerror('File is empty (on fileEntry from resolveLocalFileSystemURL)'); return } var reader = new FileReader() reader.onloadend = () => { var blob = new Blob([new Uint8Array(reader.result)], { type: 'application/octet-stream' }) if (!blob.size) { onerror('File is empty (on blob)'); return } var fd = new FormData() fd.append('file', blob, fileName) var xhr = new XMLHttpRequest() xhr.open('POST', remoteUrl, true) xhr.onload = function () { if (xhr.status === 200 || xhr.status === 201) { if (typeof callback === 'function') { callback() } } else { console.error('Error on xhr.status: ' + xhr.status); onerror(xhr.status) } } xhr.onerror = (err) => { console.error('Error on XMLHttpRequest'); onerror(err) } xhr.send(fd) } reader.onerror = (err) => { console.error('Error on FileReader'); onerror(err) } reader.readAsArrayBuffer(file) }, (err) => { console.error('Error on fileEntry.file'); onerror(err) }) }, (err) => { console.error('Error on resolveLocalFileSystemURL'); onerror(err) }) } ``` An example for download ```js downloadFileToDevice('https://example.com/img.jpg', 'myImg.jpg', cordova.file.cacheDirectory, (err, localFilePath) => { if (err) { console.error('An error occured downloading file:', err) } else { console.log('Download file with success: ' + localFilePath) } }) ``` An example for upload, exactly as the `ft.upload` in `cordova-plugin-file-transfer` ```js uploadFileToServer('file:///storage/emulated/0/Android/data/myfile.jpg', 'myfileNameOnServer.jpg', 'https://example.com/upload_url', (err) => { if (err) { console.error('Error uploading file:', err) } else { console.log('Upload done it with success') } }) ```