How to force HTML input file chooser to give the original file name in Ionic(Android)?

后端 未结 1 1667
不知归路
不知归路 2020-12-20 09:27

I am using HTML input for choosing file in my Ionic3/Angular application. I am using below code:

// in .html file



        
1条回答
  •  北海茫月
    2020-12-20 09:48

    Android does not give the original file name and file type using the above approach of mine and it is a security issue from android. So, i had to make below solution for retrieving the correct file name, file type, file size and the file data in base64.

    You will need below four plugins:

    1. FileChooser
    2. File
    3. FilePath
    4. Base64

    FileChooserAndroidProvider:

    import {Injectable} from '@angular/core';
    import {File, FileEntry, IFile} from "@ionic-native/file";
    import {Base64} from "@ionic-native/base64";
    import {FilePath} from "@ionic-native/file-path";
    import {FileChooser} from "@ionic-native/file-chooser";
    
    
    @Injectable()
    export class FileChooserAndroidProvider {
    
      constructor(private base64: Base64, private filePath: FilePath, private file: File, private fileChooser: FileChooser) {
      }
    
      getFileInfo(): Promise {
        return this.fileChooser.open().then((fileURI) => {
          return this.filePath.resolveNativePath(fileURI).then((filePath) => {
            return this.file.resolveLocalFilesystemUrl(filePath).then((fileEntry: FileEntry) => {
              return new Promise((resolve, reject) => {
                fileEntry.file(meta => resolve(meta), error => reject(error));
              });
            }).then((fileMeta: IFile) => {
              return new Promise((resolve, reject) => {
                return this.base64.encodeFile(filePath).then((base64Data) => {
                  resolve({
                    fileData: base64Data,
                    fileName: fileMeta.name,
                    fileSize: fileMeta.size,
                    fileType: fileMeta.type
                  })
                }).catch((error) => {
                  reject(error);
                })
              })
            });
          });
        });
      }
    }
    

    FileChooserAndroidProviderModule:

    import {NgModule} from '@angular/core';
    import {Base64} from "@ionic-native/base64";
    import {FileChooser} from "@ionic-native/file-chooser";
    import {FilePath} from "@ionic-native/file-path";
    import {File} from "@ionic-native/file";
    
    @NgModule({
      declarations: [],
      exports: [],
      providers: [
        FileChooser,
        File,
        FilePath,
        Base64
      ]
    })
    export class FileChooserAndroidProviderModule {
    }
    

    SamplePage:

    constructor(private fileChooserAndroid: FileChooserAndroidProvider){}
    
      uploadFileForAndroid(): void {
        this.fileChooserAndroid.getFileInfo().then((result) => {
          this.fileName = result.fileName;
          this.fileData = this.sanitizeFileData(result.fileData);
          this.fileSize = result.fileSize;
          this.fileType = result.fileType;
        }).catch((error) => {
          this.helperProvider.createAlert('Alert', 'File can not be uploaded.');
        });
      }
    

    SamplePageModule:

    @NgModule({
      declarations: [
        SamplePage
      ],
      imports: [
        FileChooserAndroidProviderModule
      ],
      providers: [
        FileChooserAndroidProvider
      ]
    })
    export class SamplePageModule {
    }
    

    0 讨论(0)
提交回复
热议问题