2016-05-15 1 views
0

J'ai reçu la même question que Modify image obtained from loopback-component-storage mais la réponse ne me satisfait pas.Valider et renommer le fichier image de loopback-component-storage

Utilisez le même exemple:

A côté client

Upload.upload(
{ 
    url: '/api/containers/container_name/upload', 
    file: file, 
    fileName: "demoImage.jpg", 
    //Additional data with file 
    params:{ 
    username : username 
    } 
}); 

Voici l'exigence:

  1. Valider le type de fichier du fichier
  2. Modifier la nom enregistré dans le serveur
  3. Rejeter si le fichier non valide ou nom d'utilisateur

Voici une référence que je et rencontrais:

  • Le nom d'utilisateur est nécessaire, il devrait donc être la méthode d'un utilisateur. J'ai ajouté une méthode à distance comme dans https://stackoverflow.com/a/31118294/5241407 et j'ai changé l'API en/api/usermodel /: id/upload. Certains codes ont été ajoutés dans remoteMethod pour envoyer le nom d'utilisateur à la fonction container.upload. Est-il possible que nous validions le type de fichier et changions le nom du fichier dans cette phase afin que je puisse retourner l'erreur si elle est invalide?

  • J'ai utilisé configure-storage.js dans le fichier de démarrage tel qu'il est dans https://stackoverflow.com/a/31059880/5241407 Mais cette solution est inadéquate. Si le client envoie un type de fichier invalide, le serveur lancera une erreur, ce qui n'est pas attendu. Il est préférable de rejeter la requête avec une réponse d'erreur au lieu de lancer une erreur système. Alors, comment retourner une erreur sans lancer une erreur au niveau du système?

  • Une fois que j'ai téléchargé un fichier png et vérifié le fichier file.type dans configure-storage.js, seulement pour trouver que le type de fichier est application/octet-stream au lieu de image/png. C'est le code que j'ai utilisé pour tester: curl -X POST --header "Content-Type: multipart/form-data" --header "Accept: application/json" "HOST/api/usermodel/userId/upload" -F "[email protected]" Ce résultat inattendu peut gêner le jugement du type de fichier.

Répondre

3

C'est ce que je l'avais fait pour valider le type de fichier et de modifier le nom du fichier,

en datasources.local.js [nom du conteneur est container]

module.exports = { 
    container: { 
    root: './upload', 
    acl: 'public-read', 
    allowedContentTypes: ['image/jpg', 'image/jpeg', 'image/png', 'image/tiff'], 
    maxFileSize: 10 * 1024 * 1024, 
    getFilename: function(fileInfo) { 
     var fileName = fileInfo.name.replace(/\s+/g, '-').toLowerCase(); 
     return 'image-' + new Date().getTime() + '-' + fileName; 
    } 
    } 
}; 

Rejet de la demande doit être traitée par ACL pour l'authentification et la vérification d'autorisation. Rejeter en fonction des noms de fichiers peut être fait par un crochet distant.

Voici un exemple (je n'ai pas testé ce)

Container.beforeRemote('create', function(context, comment, next) { 
    if (context.req.body.fileName.length < 7) { 
    context.res.statusCode = 401; 
    next(new Error('Filename is too short!')); 
    } else { 
    next(); 
    } 
}); 

J'espère que cela peut vous aider à comprendre la façon dont vous voulez.

+1

Oui, méthode à distance que vous pouvez personnaliser. Les types de contenu devraient être bien je crois. – anoop

+0

Merci. Mais allowedContentTypes ne peut toujours pas résoudre le problème 'application/octet-stream'. Je trouve la raison pour laquelle le type MINI devrait être défini lors de l'envoi de fichier. BTW la méthode de beforeRemote devrait être télécharger au lieu de créer. – Zealseeker