2016-05-15 18 views
0

Ich habe die ähnliche Frage wie Modify image obtained from loopback-component-storage, aber die Antwort ist nicht zufriedenstellend für mich.Validieren und Rename Bilddatei von Loopback-Komponente-Speicher

Verwenden Sie das gleiche Beispiel:

Auf Client-Seite

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

Dies ist die Voraussetzung:

  1. Validate der Dateityp der Datei
  2. das Ändern Name gespeichert im Server
  3. Ablehnen, wenn ungültige Datei oder Benutzername

Hier einige Referenz, die ich verwendet und begegnet:

  • Der Benutzername erforderlich ist, so dass es ein Benutzer Methode sein sollte. Ich habe eine Remote-Methode wie in https://stackoverflow.com/a/31118294/5241407 hinzugefügt und die API in/api/usermodel /: id/upload geändert. Einige Codes wurden in remoteMethod hinzugefügt, um den Benutzernamen an die Funktion container.upload zu senden. Ist es möglich, dass wir den Dateityp validieren und den Dateinamen in dieser Phase ändern, damit ich einen Fehler zurückgeben kann, wenn der ungültig ist?

  • Ich habe configure-storage.js in Boot-Datei wie in https://stackoverflow.com/a/31059880/5241407 verwendet, aber diese Lösung ist nicht ausreichend. Wenn der Client einen ungültigen Dateityp sendet, wird der Server einen Fehler ausgeben, was nicht erwartet wird. Es ist besser, die Abfrage mit einer Fehlerantwort abzulehnen, anstatt einen Systemfehler auszulösen. So, wie man Fehler zurückbringt, ohne einen Fehler im Systemlevel zu werfen?

  • Sobald ich eine PNG-Datei hochladen und überprüft die Datei.Type in configure-storage.js, nur um zu finden, dass der Dateityp Application/Octet-Stream anstelle von Bild/PNG ist. Dies ist der Code, den ich zum Sondieren verwendet habe: curl -X POST --header "Content-Type: multipart/form-data" --header "Accept: application/json" "HOST/api/usermodel/userId/upload" -F "[email protected]" Dieses unerwartete Ergebnis kann die Beurteilung des Dateityps behindern.

Antwort

3

Dies ist, was ich den Dateityp und ändern Sie den Dateinamen, [Name Container container]

in datasources.local.js zu validieren

getan hatte

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; 
    } 
    } 
}; 

Ablehnung der Anfrage über umgegangen werden soll ACLs für die Authentifizierung und Berechtigungsprüfung. Ablehnen basierend auf Dateinamen kann durch einen Remote-Hook erfolgen.

Unten ist ein Beispiel (ich habe das nicht getestet)

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(); 
    } 
}); 

Ich hoffe, das Ihnen helfen kann, die Art und Weise, um herauszufinden, die Sie wollen.

+1

Ja, Remote-Methode, die Sie anpassen können. Inhaltstypen sollten in Ordnung sein, glaube ich. – anoop

+0

Danke. Aber allowedContentTypes kann das 'application/octet-stream'-Problem immer noch nicht lösen. Ich finde den Grund, dass MINI Typ beim Senden der Datei definiert werden sollte. Übrigens sollte die Methode von beforeRemote hochgeladen werden anstatt zu erstellen. – Zealseeker