文件上传在web应用比较常见,本文以vert.x web实现文件上传功能。引用之前的项目《Vert.x 4 Web应用初识》作为基础,添加了日志。
Vertx file upload 实现
[user]
代码聚焦
//文件上传路径
String uploadDir="D:\\tmp\\vertx\\assets\\";
router.post("/file/upload")
.handler(BodyHandler.create() //必选创建body的处理器才能上传文件。
//.setBodyLimit(10*1024*1024L)//默认是10M可设置.setBodyLimit(10*1024*1024L)
.setDeleteUploadedFilesOnEnd(true)//用完后删除
)
.handler(ctx -> {
//读取非文件参数
String userId = ctx.request().getParam("userId");
log.info("userId : {}", userId);
//读取文件相关数据和操作
List<FileUpload> fileUploads = ctx.fileUploads();
//只有一个这里就直接取
FileUpload fileUpload = fileUploads.get(0);
//对应form-data 表单的key
String name = fileUpload.name();
//对应原始上传文件名称
String fileName = fileUpload.fileName();
//对应上传到本地的临时文件路径(默认应用的相对路径file-upload 可配置修改)
String uploadedFileName = fileUpload.uploadedFileName();
long size = fileUpload.size();
log.info("name:{},fileName:{},uploadedFileName:{},size:{}", name,fileName, uploadedFileName, size);
//读取文件并写入到目标去(注意这里用的是同步,你也可以用异步写入)
Buffer buffer = vertx.fileSystem().readFileBlocking(uploadedFileName);
vertx.fileSystem().writeFileBlocking(uploadDir+fileName, buffer);
ctx.response()
.putHeader("content-type", "text/plain")
.end(uploadedFileName);
});
[/user]
暴露静态资源方便验证演示
//静态资源暴露
router.route("/assets/*")
.handler(StaticHandler.create(FileSystemAccess.ROOT,uploadDir))
.handler(StaticHandler.create("assets"));
启动项目并使用postman测试,观察返回和控制台
可以看到,控制台输出和postman返回与预期结果一致。
上传后使用浏览器访问地址:http://localhost:8888/assets/vertx.png
正常显示,与预期结果一致。
http://blog.xqlee.com/article/2408161050139762.html