Java Vertx-限制上载文件类型

Java Vertx-限制上载文件类型,java,vert.x,Java,Vert.x,我正在使用Vertx创建一个API,允许用户上传图像,但我想限制为某些文件类型-jpg | Jpeg | png 最好的方法是什么 private void uploadLogoHandler(RoutingContext context) { //Filter content type } 我不知道有什么“最好”的方法可以做到这一点。但这里有一些选择 [1] 在客户端上,在允许用户上载文件之前查看文件的扩展名(隐藏最终上载按钮,仅在用户选择具有正确扩展名的文件名后显示)。您可以在客户

我正在使用Vertx创建一个API,允许用户上传图像,但我想限制为某些文件类型-
jpg | Jpeg | png

最好的方法是什么

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

}
我不知道有什么“最好”的方法可以做到这一点。但这里有一些选择

[1] 在客户端上,在允许用户上载文件之前查看文件的扩展名(隐藏最终上载按钮,仅在用户选择具有正确扩展名的文件名后显示)。您可以在客户端javascript中执行此操作,您不能访问文件的完整路径,但可以访问文件名(减去路径)

[2] 在服务器上执行上述操作。您应该能够在多部分上传中获取文件名

[3] 在上传过程中,没有简单的方法可以检查实际的文件类型。我要做的(如果您正在检查图像)是将其写入临时文件,然后运行JavaImageIO读取图像。如果它读取时没有错误,那么它是一个图像,如果没有错误,您将得到一个异常,并删除该文件。我不知道这样做有什么安全问题。请注意,通过ImageIO读取文件是一种阻塞操作,因此请将其放在vert.x执行阻塞中。

我不知道执行此操作的“最佳”方法。但这里有一些选择

[1] 在客户端上,在允许用户上载文件之前查看文件的扩展名(隐藏最终上载按钮,仅在用户选择具有正确扩展名的文件名后显示)。您可以在客户端javascript中执行此操作,您不能访问文件的完整路径,但可以访问文件名(减去路径)

[2] 在服务器上执行上述操作。您应该能够在多部分上传中获取文件名

[3] 在上传过程中,没有简单的方法可以检查实际的文件类型。我要做的(如果您正在检查图像)是将其写入临时文件,然后运行JavaImageIO读取图像。如果它读取时没有错误,那么它是一个图像,如果没有错误,您将得到一个异常,并删除该文件。我不知道这样做有什么安全问题。请注意,通过ImageIO读取文件是一种阻塞操作,因此请将其放在vert.x执行阻塞中。

HTML:

在vert.x上,我们需要检查上传文件的内容类型,假设我们只有一次上传:

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
}
Set fileUploads=routingContext.fileUploads();
FileUpload FileUpload=fileUploads.iterator().next();
fileUpload.contentType();
如果(!fileUpload.contentType().startsWith(“image/”){
routingContext.response().putHeader(“内容类型”,“文本/html”).end(“请上传图像”);
}否则{
//处理你的图像
}
HTML:

在vert.x上,我们需要检查上传文件的内容类型,假设我们只有一次上传:

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
}
Set fileUploads=routingContext.fileUploads();
FileUpload FileUpload=fileUploads.iterator().next();
fileUpload.contentType();
如果(!fileUpload.contentType().startsWith(“image/”){
routingContext.response().putHeader(“内容类型”,“文本/html”).end(“请上传图像”);
}否则{
//处理你的图像
}

这将起作用,但文件将由服务器上传和处理,如果您真的想避免这一工作,您应该在
BodyHandler
之前添加一个处理程序,并在此处进行检查,如果内容类型匹配,则继续,否则使用400状态代码终止请求(错误请求)或者更适合您的用例。但这将成为所有文件上传的通用要求,我不知道确切的要求,但您可以使用
router.route(“/*”).handler(ur handler)这会识别“假装”为图像但不是图像的文件吗?我认为您需要实际扫描该文件,以验证其类型是否正确。否?这将起作用,但文件将由服务器上载和处理,如果您确实想避免这一工作,您应该在
BodyHandler
之前添加一个处理程序,并在此处执行检查,如果内容类型匹配,则继续,否则使用400状态代码终止请求(错误请求)或者更适合您的用例。但这将成为所有文件上传的通用要求,我不知道确切的要求,但您可以使用
router.route(“/*”).handler(ur handler)这会识别“假装”为图像但不是图像的文件吗?我认为您需要实际扫描该文件,以验证其类型是否正确。不