web-dev-qa-db-fra.com

Enregistrement du fichier dans le répertoire Téléchargements avec Ionic 3

je connais ce lien: https://cordova.Apache.org/docs/fr/latest/reference/cordova-plugin-file/#where-to-store-files

mais je voudrais enregistrer le fichier dans le répertoire Téléchargements. Est-il possible de sauvegarder le fichier dans n’importe quel chemin en utilisant Ionic? Si oui, s'il vous plaît, partagez l'exemple.

Voici le code:

downloadImage(image) {

this.platform.ready().then(() => {

  const fileTransfer: TransferObject = this.transfer.create();

  const imageLocation = `${cordova.file.applicationDirectory}www/assets/img/${image}`;

  fileTransfer.download(imageLocation, cordova.file.externalDataDirectory + image).then((entry) => {

    const alertSuccess = this.alertCtrl.create({
      title: `Download Succeeded!`,
      subTitle: `${image} was successfully downloaded to: ${entry.toURL()}`,
      buttons: ['Ok']
    });

    alertSuccess.present();

  }, (error) => {

    const alertFailure = this.alertCtrl.create({
      title: `Download Failed!`,
      subTitle: `${image} was not successfully downloaded. Error code: ${error.code}`,
      buttons: ['Ok']
    });

    alertFailure.present();

  });

});

}

Fondamentalement, je veux enregistrer le fichier dans un emplacement visible pour l'utilisateur.

4
bambaniasz

le problème était le manque de permission. Voici le code de travail pouvant télécharger un fichier dans le répertoire de téléchargement:

async downloadFile() {
  await this.fileTransfer.download("https://cdn.pixabay.com/photo/2017/01/06/23/21/soap-bubble-1959327_960_720.jpg", this.file.externalRootDirectory + 
  '/Download/' + "soap-bubble-1959327_960_720.jpg");
}

getPermission() {
  this.androidPermissions.hasPermission(this.androidPermissions.PERMISSION.READ_EXTERNAL_STORAGE)
    .then(status => {
      if (status.hasPermission) {
        this.downloadFile();
      } 
      else {
        this.androidPermissions.requestPermission(this.androidPermissions.PERMISSION.READ_EXTERNAL_STORAGE)
          .then(status => {
            if(status.hasPermission) {
              this.downloadFile();
            }
          });
      }
    });
}
2
bambaniasz

Pour télécharger le fichier dans le répertoire de téléchargement, vous devez utiliser Cordova Fichier et FileTransfer Plugins.

import { File } from '@ionic-native/file';
import { FileTransfer } from '@ionic-native/file-transfer';

constructor(private transfer: FileTransfer) { }

fileTransfer: FileTransferObject = this.transfer.create();

//Use your File Url and name

downloadFile(file) {
  // Some Loading
  this.fileTransfer.download(url, this.file.externalRootDirectory + 
  '/Download/' + file).then(response => {
  console.log(response);
  this.dismissLoading();
  this.presentToast('File has been downloaded to the Downloads folder. View 
  it..')
  })
  .catch(err => {
    this.dismissLoading();
    console.log(err)
  });
}

J'espère que ça aide.

3
fiza khan
import { File } from '@ionic-native/file';
import { FileTransfer } from '@ionic-native/file-transfer';
constructor(private file: File, private transfer: FileTransfer){}

let link = 'url_to_download_file';
let path = '';
let dir_name = 'Download'; // directory to download - you can also create new directory
let file_name = 'file.txt'; //any file name you like

const fileTransfer: FileTransferObject = this.transfer.create();
let result = this.file.createDir(this.file.externalRootDirectory, dir_name, true);
result.then((resp) => {
  path = resp.toURL();
  console.log(path);
  fileTransfer.download(link, path + file_name).then((entry) => {
    console.log('download complete: ' + entry.toURL());
  }, (error) => {
    console.log(error)
  });
}, (err) => {
  console.log('error on creating path : ' + err);
});
1

Ce code - condensateur ionique 3 - de josh morony prend une photo du répertoire tmp et écrit dans le répertoire Document de cette section à l’aide de l’API FileSystem pour récupérer et manipuler le chemin.

        Filesystem.writeFile({
            data: result.data,
            path: fileName,
            directory: FilesystemDirectory.Data
        })



getFromPhotos() {

  let options = {
  resultType: CameraResultType.Uri
  };

  Camera.getPhoto(options).then(

(photo) => {

    Filesystem.readFile({
        path: photo.path
    }).then((result) => {

        // let date = new Date(),
        // time = date.getTime(),
        time = 'bilder',
            fileName = time + '.jpeg';

        Filesystem.writeFile({
            data: result.data,
            path: fileName,
            directory: FilesystemDirectory.Data
        }).then((result) => {
            Filesystem.getUri({
                directory: FilesystemDirectory.Data,
                path: fileName
            }).then((result) => {
                console.log(result);
              let path = result.uri.replace('file://', '_capacitor_');
              this.image = this.sanitizer.bypassSecurityTrustResourceUrl(path);
            }, (err) => {
                console.log(err);
            });

        }, (err) => {
            console.log(err);
        });

    }, (err) => {
        console.log(err);
    });

}, (err) => {
    console.log(err);
}

);

}

Dans ionic 3, vous devez utiliser le plugin Cordova File - veuillez consulter Google. C'est assez simple à comprendre: vous définissez le répertoire d'origine où se trouve le fichier, le nom d'origine du fichier, le répertoire cible et un nouveau nom pour le fichier dans cette fonction. Le principe est le même.

0
Ed Die

Je sais que c'est tard, mais j'ai toujours eu des problèmes avec le plugin FileTransfer. Peut-être que c'est juste moi. J'ai plutôt eu du succès avec la méthode writeFile() du plugin File.

Je travaille toujours sur iOS, mais voici ce que j'ai pour Android:

import { File } from "@ionic-native/file";

constructor(private fileSystem: File) {}

Ensuite, quelle que soit la fonction dont vous avez la logique pour enregistrer le fichier, nous avons:

let path = this.fileSystem.externalRootDirectory + '/Download/'; // for Android
let filename = 'myNewFile.pdf';
this.fileSystem.writeFile(path, filename, File, { replace: true }).then(() => {
        this.toastCtrl.showToast('File has been downloaded. Please check your downloads folder.');
    }, (err) => {
        alert("Sorry. An error occurred downloading the file: " + err);
    }
);

Comme je l'ai dit, je cherche toujours quel chemin utiliser pour iOS. Et je me demande toujours comment faire apparaître la notification qui apparaît généralement lorsqu'un téléchargement va effectivement dans le dossier de téléchargement. Mais au moins, je peux enregistrer directement dans le dossier de téléchargement d’Android.

0
mateotherock