Phonegap File Upload - how to get file extension?

与世无争的帅哥 提交于 2019-12-11 12:40:38

问题


I'm using Filetransfer API in a phonegap app.

Now, I'm finding impossible to get around this, and couldn't find a solution.

I have used both .toURL() and .fullPath, but both return the same.
If I use:

window.resolveLocalFileSystemURL(imageURI, function(entry){
    console.log(entry.toURL()+' -- ' +entry.fullPath);
}); 

I get:

content://com.android.providers.media.documents/document/image%3A8055 -- /com.android.providers.media.documents/document/image%3A8055

Is there a simple way to get the extension or even the full name of the file captured by the phone?

Thanks for the input.


回答1:


This answer is a "workaround" only if you cannot get the file extension from your version of Cordova API.

Since you cannot really extract much information about a string URI, what I did was scan through other objects provided by the Cordova then I found the File object which contains at least what I needed, the MIME type.

From the client side code you need to do this:

// After you get the URI of the file
window.resolveLocalFileSystemURL(fileUri, function(fileEntry) {
    fileEntry.file(function(file) {
       uploadFile(fileEntry, file.type); 
    });
});

// Code snippet for uploadFile function
function uploadFile(fileEntry, fileType) {
    var serverUrl = DOMAIN + 'api/upload-file.php';
    var options = new FileUploadOptions();

    options.fileKey = "file";
    options.fileName = fileEntry.name;
    options.mimeType = fileType;
    options.chunkedMode = false;
    // More codes are omitted for brevity
}

If you're using PHP as a server side script, you can extract the information you have injected before, using $_FILES['file'], which resolves to the file you uploaded and $_FILES['file']['type'], which would resolve to a MIME type of that file.

Now for mapping it into an extension name, you can use the code below:

function mimeToExt($mime) {
    $extensions = array(
        'hqx'   =>  array('application/mac-binhex40', 'application/mac-binhex', 'application/x-binhex40', 'application/x-mac-binhex40'),
        'cpt'   =>  'application/mac-compactpro',
        'csv'   =>  array('text/x-comma-separated-values', 'text/comma-separated-values', 'application/octet-stream', 'application/vnd.ms-excel', 'application/x-csv', 'text/x-csv', 'text/csv', 'application/csv', 'application/excel', 'application/vnd.msexcel', 'text/plain'),
        'bin'   =>  array('application/macbinary', 'application/mac-binary', 'application/octet-stream', 'application/x-binary', 'application/x-macbinary'),
        'dms'   =>  'application/octet-stream',
        'lha'   =>  'application/octet-stream',
        'lzh'   =>  'application/octet-stream',
        'exe'   =>  array('application/octet-stream', 'application/x-msdownload'),
        'class' =>  'application/octet-stream',
        'psd'   =>  array('application/x-photoshop', 'image/vnd.adobe.photoshop'),
        'so'    =>  'application/octet-stream',
        'sea'   =>  'application/octet-stream',
        'dll'   =>  'application/octet-stream',
        'oda'   =>  'application/oda',
        'pdf'   =>  array('application/pdf', 'application/force-download', 'application/x-download', 'binary/octet-stream'),
        'ai'    =>  array('application/pdf', 'application/postscript'),
        'eps'   =>  'application/postscript',
        'ps'    =>  'application/postscript',
        'smi'   =>  'application/smil',
        'smil'  =>  'application/smil',
        'mif'   =>  'application/vnd.mif',
        'xls'   =>  array('application/vnd.ms-excel', 'application/msexcel', 'application/x-msexcel', 'application/x-ms-excel', 'application/x-excel', 'application/x-dos_ms_excel', 'application/xls', 'application/x-xls', 'application/excel', 'application/download', 'application/vnd.ms-office', 'application/msword'),
        'ppt'   =>  array('application/powerpoint', 'application/vnd.ms-powerpoint', 'application/vnd.ms-office', 'application/msword'),
        'pptx'  =>  array('application/vnd.openxmlformats-officedocument.presentationml.presentation', 'application/x-zip', 'application/zip'),
        'wbxml' =>  'application/wbxml',
        'wmlc'  =>  'application/wmlc',
        'dcr'   =>  'application/x-director',
        'dir'   =>  'application/x-director',
        'dxr'   =>  'application/x-director',
        'dvi'   =>  'application/x-dvi',
        'gtar'  =>  'application/x-gtar',
        'gz'    =>  'application/x-gzip',
        'gzip'  =>  'application/x-gzip',
        'php'   =>  array('application/x-httpd-php', 'application/php', 'application/x-php', 'text/php', 'text/x-php', 'application/x-httpd-php-source'),
        'php4'  =>  'application/x-httpd-php',
        'php3'  =>  'application/x-httpd-php',
        'phtml' =>  'application/x-httpd-php',
        'phps'  =>  'application/x-httpd-php-source',
        'js'    =>  array('application/x-javascript', 'text/plain'),
        'swf'   =>  'application/x-shockwave-flash',
        'sit'   =>  'application/x-stuffit',
        'tar'   =>  'application/x-tar',
        'tgz'   =>  array('application/x-tar', 'application/x-gzip-compressed'),
        'z' =>  'application/x-compress',
        'xhtml' =>  'application/xhtml+xml',
        'xht'   =>  'application/xhtml+xml',
        'zip'   =>  array('application/x-zip', 'application/zip', 'application/x-zip-compressed', 'application/s-compressed', 'multipart/x-zip'),
        'rar'   =>  array('application/x-rar', 'application/rar', 'application/x-rar-compressed'),
        'mid'   =>  'audio/midi',
        'midi'  =>  'audio/midi',
        'mpga'  =>  'audio/mpeg',
        'mp2'   =>  'audio/mpeg',
        'mp3'   =>  array('audio/mpeg', 'audio/mpg', 'audio/mpeg3', 'audio/mp3'),
        'aif'   =>  array('audio/x-aiff', 'audio/aiff'),
        'aiff'  =>  array('audio/x-aiff', 'audio/aiff'),
        'aifc'  =>  'audio/x-aiff',
        'ram'   =>  'audio/x-pn-realaudio',
        'rm'    =>  'audio/x-pn-realaudio',
        'rpm'   =>  'audio/x-pn-realaudio-plugin',
        'ra'    =>  'audio/x-realaudio',
        'rv'    =>  'video/vnd.rn-realvideo',
        'wav'   =>  array('audio/x-wav', 'audio/wave', 'audio/wav'),
        'bmp'   =>  array('image/bmp', 'image/x-bmp', 'image/x-bitmap', 'image/x-xbitmap', 'image/x-win-bitmap', 'image/x-windows-bmp', 'image/ms-bmp', 'image/x-ms-bmp', 'application/bmp', 'application/x-bmp', 'application/x-win-bitmap'),
        'gif'   =>  'image/gif',
        'jpeg'  =>  array('image/jpeg', 'image/pjpeg'),
        'jpg'   =>  array('image/jpeg', 'image/pjpeg'),
        'jpe'   =>  array('image/jpeg', 'image/pjpeg'),
        'jp2'   =>  array('image/jp2', 'video/mj2', 'image/jpx', 'image/jpm'),
        'j2k'   =>  array('image/jp2', 'video/mj2', 'image/jpx', 'image/jpm'),
        'jpf'   =>  array('image/jp2', 'video/mj2', 'image/jpx', 'image/jpm'),
        'jpg2'  =>  array('image/jp2', 'video/mj2', 'image/jpx', 'image/jpm'),
        'jpx'   =>  array('image/jp2', 'video/mj2', 'image/jpx', 'image/jpm'),
        'jpm'   =>  array('image/jp2', 'video/mj2', 'image/jpx', 'image/jpm'),
        'mj2'   =>  array('image/jp2', 'video/mj2', 'image/jpx', 'image/jpm'),
        'mjp2'  =>  array('image/jp2', 'video/mj2', 'image/jpx', 'image/jpm'),
        'png'   =>  array('image/png',  'image/x-png'),
        'tiff'  =>  'image/tiff',
        'tif'   =>  'image/tiff',
        'css'   =>  array('text/css', 'text/plain'),
        'html'  =>  array('text/html', 'text/plain'),
        'htm'   =>  array('text/html', 'text/plain'),
        'shtml' =>  array('text/html', 'text/plain'),
        'txt'   =>  'text/plain',
        'text'  =>  'text/plain',
        'log'   =>  array('text/plain', 'text/x-log'),
        'rtx'   =>  'text/richtext',
        'rtf'   =>  'text/rtf',
        'xml'   =>  array('application/xml', 'text/xml', 'text/plain'),
        'xsl'   =>  array('application/xml', 'text/xsl', 'text/xml'),
        'mpeg'  =>  'video/mpeg',
        'mpg'   =>  'video/mpeg',
        'mpe'   =>  'video/mpeg',
        'qt'    =>  'video/quicktime',
        'mov'   =>  'video/quicktime',
        'avi'   =>  array('video/x-msvideo', 'video/msvideo', 'video/avi', 'application/x-troff-msvideo'),
        'movie' =>  'video/x-sgi-movie',
        'doc'   =>  array('application/msword', 'application/vnd.ms-office'),
        'docx'  =>  array('application/vnd.openxmlformats-officedocument.wordprocessingml.document', 'application/zip', 'application/msword', 'application/x-zip'),
        'dot'   =>  array('application/msword', 'application/vnd.ms-office'),
        'dotx'  =>  array('application/vnd.openxmlformats-officedocument.wordprocessingml.document', 'application/zip', 'application/msword'),
        'xlsx'  =>  array('application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', 'application/zip', 'application/vnd.ms-excel', 'application/msword', 'application/x-zip'),
        'word'  =>  array('application/msword', 'application/octet-stream'),
        'xl'    =>  'application/excel',
        'eml'   =>  'message/rfc822',
        'json'  =>  array('application/json', 'text/json'),
        'pem'   =>  array('application/x-x509-user-cert', 'application/x-pem-file', 'application/octet-stream'),
        'p10'   =>  array('application/x-pkcs10', 'application/pkcs10'),
        'p12'   =>  'application/x-pkcs12',
        'p7a'   =>  'application/x-pkcs7-signature',
        'p7c'   =>  array('application/pkcs7-mime', 'application/x-pkcs7-mime'),
        'p7m'   =>  array('application/pkcs7-mime', 'application/x-pkcs7-mime'),
        'p7r'   =>  'application/x-pkcs7-certreqresp',
        'p7s'   =>  'application/pkcs7-signature',
        'crt'   =>  array('application/x-x509-ca-cert', 'application/x-x509-user-cert', 'application/pkix-cert'),
        'crl'   =>  array('application/pkix-crl', 'application/pkcs-crl'),
        'der'   =>  'application/x-x509-ca-cert',
        'kdb'   =>  'application/octet-stream',
        'pgp'   =>  'application/pgp',
        'gpg'   =>  'application/gpg-keys',
        'sst'   =>  'application/octet-stream',
        'csr'   =>  'application/octet-stream',
        'rsa'   =>  'application/x-pkcs7',
        'cer'   =>  array('application/pkix-cert', 'application/x-x509-ca-cert'),
        '3g2'   =>  'video/3gpp2',
        '3gp'   =>  array('video/3gp', 'video/3gpp'),
        'mp4'   =>  'video/mp4',
        'm4a'   =>  'audio/x-m4a',
        'f4v'   =>  array('video/mp4', 'video/x-f4v'),
        'flv'   =>  'video/x-flv',
        'webm'  =>  'video/webm',
        'aac'   =>  'audio/x-acc',
        'm4u'   =>  'application/vnd.mpegurl',
        'm3u'   =>  'text/plain',
        'xspf'  =>  'application/xspf+xml',
        'vlc'   =>  'application/videolan',
        'wmv'   =>  array('video/x-ms-wmv', 'video/x-ms-asf'),
        'au'    =>  'audio/x-au',
        'ac3'   =>  'audio/ac3',
        'flac'  =>  'audio/x-flac',
        'ogg'   =>  array('audio/ogg', 'video/ogg', 'application/ogg'),
        'kmz'   =>  array('application/vnd.google-earth.kmz', 'application/zip', 'application/x-zip'),
        'kml'   =>  array('application/vnd.google-earth.kml+xml', 'application/xml', 'text/xml'),
        'ics'   =>  'text/calendar',
        'ical'  =>  'text/calendar',
        'zsh'   =>  'text/x-scriptzsh',
        '7zip'  =>  array('application/x-compressed', 'application/x-zip-compressed', 'application/zip', 'multipart/x-zip'),
        'cdr'   =>  array('application/cdr', 'application/coreldraw', 'application/x-cdr', 'application/x-coreldraw', 'image/cdr', 'image/x-cdr', 'zz-application/zz-winassoc-cdr'),
        'wma'   =>  array('audio/x-ms-wma', 'video/x-ms-asf'),
        'jar'   =>  array('application/java-archive', 'application/x-java-application', 'application/x-jar', 'application/x-compressed'),
        'svg'   =>  array('image/svg+xml', 'application/xml', 'text/xml'),
        'vcf'   =>  'text/x-vcard',
        'srt'   =>  array('text/srt', 'text/plain'),
        'vtt'   =>  array('text/vtt', 'text/plain'),
        'ico'   =>  array('image/x-icon', 'image/x-ico', 'image/vnd.microsoft.icon'),
        'odc'   =>  'application/vnd.oasis.opendocument.chart',
        'otc'   =>  'application/vnd.oasis.opendocument.chart-template',
        'odf'   =>  'application/vnd.oasis.opendocument.formula',
        'otf'   =>  'application/vnd.oasis.opendocument.formula-template',
        'odg'   =>  'application/vnd.oasis.opendocument.graphics',
        'otg'   =>  'application/vnd.oasis.opendocument.graphics-template',
        'odi'   =>  'application/vnd.oasis.opendocument.image',
        'oti'   =>  'application/vnd.oasis.opendocument.image-template',
        'odp'   =>  'application/vnd.oasis.opendocument.presentation',
        'otp'   =>  'application/vnd.oasis.opendocument.presentation-template',
        'ods'   =>  'application/vnd.oasis.opendocument.spreadsheet',
        'ots'   =>  'application/vnd.oasis.opendocument.spreadsheet-template',
        'odt'   =>  'application/vnd.oasis.opendocument.text',
        'odm'   =>  'application/vnd.oasis.opendocument.text-master',
        'ott'   =>  'application/vnd.oasis.opendocument.text-template',
        'oth'   =>  'application/vnd.oasis.opendocument.text-web'
    );

    foreach ($extensions as $key => $value) {
        if (is_array($value)) {
            foreach($value as $k) {
                if ($k === $mime) {
                    return $key;
                }
            }
        }
        else {
            if ($value === $mime) {
                return $key;
            }
        }
    }
    return 'unknown';
}



回答2:


I think what you are looking for should be something like this.

var file = "sample.jpg";
	
window.requestFileSystem(LocalFileSystem.PERSISTENT, 0, function(fileSys){
	fileSys.root.getDirectory("FolderName", 
				{create:true, exclusive: false}, 
				  function(directory) {
					  alert("File URL: "+directory.toURL()+file);
				  }, getDirectoryError);
				},
getDirectoryError);
function getDirectoryError(error) {
    console.log("getDirectoryError: "+error.code);
}


来源:https://stackoverflow.com/questions/31858074/phonegap-file-upload-how-to-get-file-extension

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!