2017-03-29 4 views
1

私はVertxを使用してユーザーがイメージをアップロードできるようにAPIを作成していますが、特定のファイルタイプ(jpg|Jpeg|png)に制限したいと考えています。Vertx - 制限アップロードファイルタイプ

これを行うにはどうすればよいですか?

private void uploadLogoHandler(RoutingContext context) { 
    //Filter content type 

} 

答えて

2

HTML:vert.xで

<input type="file" name="myImage" accept="image/*" />

我々は唯一のアップロードを持つことになりますと仮定すると、アップロードされたファイルの内容の種類を確認する必要があります。

Set<FileUpload> fileUploads = routingContext.fileUploads(); 
FileUpload fileUpload = fileUploads.iterator().next(); 
fileUpload.contentType(); 
if(!fileUpload.contentType().startsWith("image/")){ 
    routingContext.response().putHeader("content-type", "text/html").end("Please upload an image."); 
}else{ 
    // Process your image 
} 
+0

これは動作しますが、ファイルあなたが本当にその作業を避けたいのであれば、ここでやっているチェックで 'BodyHandler'の前にハンドラを追加しなければならない場合、コンテンツタイプが一致する場合は続行し、そうでなければリクエストを終了してください400ステータスコード(Bad Request)または何かあなたのユースケースに適しています。 –

+0

しかし、これはすべてのファイルアップロードの一般的なものになります。私は正確な要件はわかりませんが、 'router.route("/* ")。handler(ur handler);' –

+0

"イメージ"である "ふりをする"が、そうではありませんか?私はあなたが実際にそれが正しいタイプであることを確認するためにファイルをスキャンする必要があると思います。いいえ? – adamM

1

私は「最良の」方法を知らない。しかし、ここにいくつかのオプションがあります

[1]クライアントでは、アップロードを許可する前にファイルの拡張子を見てください(最後のアップロードボタンを隠して、正しい拡張子のファイル名を選択した後でのみ表示します)。 )。あなたは、クライアントサイドのJavaScriptでこれを行うことができます、あなたはファイルの完全なパスにアクセスすることはできませんが、パスのマイナスファイルの名前にアクセスすることができます。

[2]サーバー上で上記と同じ操作を行います。あなたはmuti-partのuplaodでファイルの名前をつかむことができるはずです。

[3]アップロードの進行中に実際のファイルタイプが何であるかを簡単に確認する方法はありません。私が(イメージをチェックしている場合)は、それを一時ファイルに書き込み、Java ImageIOを実行してイメージを読み込みます。エラーなしで読み込んだ場合はイメージ、それ以外の場合は例外を取得してファイルを削除します。私はこれを行うセキュリティ上の問題を認識していません。 ImageIOを介してファイルを読み取ることはブロック操作であるため、vert.x実行ブロッキングに配置してください。