2016-05-15 4 views
0

私はModify image obtained from loopback-component-storageと同様の質問がありますが、その答えは私には満足できません。ループバックコンポーネントストレージからイメージファイルを検証して名前を変更

は同じ例を使用します。

  1. 検証ファイルのファイルタイプ
  2. 修正インクルード:ここでは、クライアント側では

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

    は必要条件でありますサーバーに保存された名前

  3. 0それは、ユーザーのメソッドである必要がありますので、ユーザ名が必要です

    • :無効なファイルまたはユーザ名ここで

は、私が使用して発生したいくつかの参照である場合

  • を拒否します。 https://stackoverflow.com/a/31118294/5241407のようなリモートメソッドを追加し、apiを/ api/usermodel /:id/uploadに変更しました。いくつかのコードは、container.upload機能にユーザー名を送るためにremoteMethodに追加されました。この段階でファイルの種類を有効にしてファイル名を変更して、ファイル名が無効な場合にエラーを返すことは可能でしょうか?

  • 私はhttps://stackoverflow.com/a/31059880/5241407のようにブートファイルにconfigure-storage.jsを使用しましたが、この解決策は不十分です。クライアントが無効なファイルタイプを送信した場合、サーバーはエラーをスローしますが、これは予期しないことです。システムエラーをスローするのではなく、エラー応答でクエリを拒否することをお勧めします。だからシステムレベルでエラーをスローせずにエラーを返す方法は?

  • 一度pngファイルをアップロードし、configure-storage.jsのfile.typeをチェックすると、ファイルタイプがimage/pngではなくapplication/octet-streamであることがわかります。これはプローブに使用したコードです:curl -X POST --header "Content-Type: multipart/form-data" --header "Accept: application/json" "HOST/api/usermodel/userId/upload" -F "[email protected]"この予期しない結果がファイルの種類の判断を妨げる可能性があります。リクエストのdatasources.local.js

  • 答えて

    3

    これは私がファイルの種類を検証するために行われ、ファイル名を変更していたもので、

    [コンテナ名が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; 
        } 
        } 
    }; 
    

    拒絶を経由して処理する必要があります認証および認可チェック用のACL。ファイル名に基づく拒否は、リモートフックで行うことができます。以下は

    はサンプル(私はこれをテストしていない)

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

    私は、これはあなたが望むように把握するお手伝いをすることを願っています。

    +1

    ええ、リモートメソッドをカスタマイズすることができます。コンテンツの種類は、私が信じているはずです。 – anoop

    +0

    ありがとうございます。しかし、allowedContentTypesは 'application/octet-stream'の問題を解決できません。ファイルを送信するときにMINIタイプを定義する必要がある理由がわかります。ところで、beforeRemoteのメソッドはcreateの代わりにアップロードする必要があります。 – Zealseeker

    関連する問題