最近在弄一个vertx的小项目,最近的一点小记录。。。

vertx post上传文件参数,是需要特殊处理一下的,开始以为用routingContext的getBody就能都获取到,后来翻文档发现这么一句If you want to upload files and send attributes, you can create a MultipartForm and use sendMultipartForm.

官方示例

MultipartForm form = MultipartForm.create().attribute("imageDescription", "a very nice image").binaryFileUpload("imageFile", "image.jpg", "/path/to/image", "image/jpeg");// Submit the form as a multipart form body
client.post(8080, "myserver.mycompany.com", "/some-uri").sendMultipartForm(form, ar -> {if (ar.succeeded()) {// Ok}});

那么问题来了,binaryFileUpload的参数该怎么传?首先文件可以通过routingContext.fileUploads()中获取,是一个set,然后我们构造一个MultipartForm类型的参数把文件循环塞进去,用来传给sendMultipartForm方法的第一个参数。请求头"multipart/form-data" 这货是不用自己加的,经过翻代码sendMultipartForm默认会带这个请求头。

部分代码如下

      MultipartForm multipartForm = MultipartForm.create();
//处理其他非文件属性MultiMap attributes = routingContext.request().formAttributes();attributes.forEach(attribute -> {multipartForm.attribute(attribute.getKey(), attribute.getValue());});
//处理文件上传参数routingContext.fileUploads().forEach(fileUpload -> {
//注意这四个参数分别传什么multipartForm.binaryFileUpload(fileUpload.name(), fileUpload.fileName(),fileUpload.uploadedFileName(), fileUpload.contentType());});
request.timeout(10000).sendMultipartForm(multipartForm, ar -> {if (ar.succeeded()) {//}else{//}});

请求上传的文件默认会放到工程下的file-uploads文件夹,而且会自动命名为一个很长的字符,不是你上传的文件名,且不带扩展名,但不影响使用()。我这里是做了一个识别,识别完了并不用保存上传的数据,所以需要清理一下。

删除方法如下,vertx fileSystem文件系统是核心包的内容,我用到了递归删除file-uploads文件夹及下面所有文件,如果只是删除某个文件,用delete(String path, Handler<AsyncResult<Void>> handler)这个方法就可以。更多详细用法可以看官网api https://vertx.io/docs/apidocs/io/vertx/core/file/FileSystem.htm

这里如果报空指针基本就是vertx没传进来是null,或者路径写错了。

                        vertx.fileSystem().exists("file-uploads", result -> {if (result.succeeded() && result.result()) {
//true 代表使用递归删除vertx.fileSystem().deleteRecursive("file-uploads", true, r -> logger.info("upload Files deleted"));} else {logger.error("cannot delete" + result.cause());}});

写到这里有的朋友可能会问了,我不想存到file-uploads这个文件夹怎么办呢。。既然文件是从RoutingContext中获取的,在源码发现重要的一句注释The context must have first been routed to a * {@link io.vertx.ext.web.handler.BodyHandler} for this to work,果然默认设置是在BodyHandler,String DEFAULT_UPLOADS_DIRECTORY = "file-uploads",给route加handler的时候要最先加BodyHandler,示例如下。

  Router router = Router.router(vertx);router.route("/myapi/*")
//BodyHandler要放到第一个!!
.handler(BodyHandler.create()
//自定义文件上传到哪
.setUploadsDirectory("mydir")
//请求结束后是否删除上传文件
.setDeleteUploadedFilesOnEnd(true));

嗨瞧瞧我又在源码发现了什么,原来不用自己造轮子删除呀,bodyHandler提供了setDeleteUploadedFilesOnEnd方法即在结束的时候干掉已上传的文件, if uploaded files should be removed after handling the request 传true,默认是false。

比较了一下区别,上面的自己写的使用文件系统递归删除简单粗暴,文件夹也干掉了,缺点,路径是写死的。使用setDeleteUploadedFilesOnEnd(true),文件夹还存在,具体是怎么删除的可以参见BodyHandler的实现类BodyHandlerImpl,顺带可以观摩一下里面写的,原来上传默认生成的文件名是UUID.randomUUID().toString()呀。

其实官方文档和源码注释写的还是挺详细的,示例也不少,还需要多研究。。

vertx web client 接收文件上传file-uploads及删除上传文件相关推荐

  1. linux里用于剪切文件,Linux_拷贝,剪切,删除和创建文件

    cp 你要拷贝的文件 + 目录/带路径的文件名(在拷贝的同时,让这个文件重新命名) cp /tep/dir01  ~  代表将dir01拷贝到当前用户的家目录中 cp /tep/dir02  ~/di ...

  2. 重复文件查找_Duplicate File Remover PRO for mac(Mac文件重复查找软件)

    Duplicate File Remover PRO for mac是一款mac上的mac文件重复查找软件,Duplicate File Remover PRO for mac能将您的文件根据种类分为 ...

  3. C#文件操作 追加、拷贝、删除、移动文件、创建目录 修改文件名、文件夹名

    C#追加文件 StreamWriter sw = File.AppendText(Server.MapPath(".")+"\\myText.txt"); sw ...

  4. 第十一章 文件操作_C语言插入、删除、更改文件内容

    我们平时所见的文件,例如 txt.doc.mp4 等,文件内容是按照从头到尾的顺序依次存储在磁盘上的,就像排起一条长长的队伍,称为顺序文件. 除了顺序文件,还有索引文件.散列文件等,一般用于特殊领域, ...

  5. linux移动新建文件夹,Linux(centos)新建,删除,移动文件夹和文件的命令

    1.新建文件夹 mkdir 文件名 新建一个名为test的文件夹在home下 view source1 mkdir /home/test 2.新建文本 在home下新建一个test.sh脚本 vi / ...

  6. linux配置定时删除日志文件,Linux使用shell脚本定时删除历史日志文件

    Linux使用shell脚本定时删除历史日志文件,文件,小时,时间,目录,脚本 Linux使用shell脚本定时删除历史日志文件 易采站长站,站长之家为您整理了Linux使用shell脚本定时删除历史 ...

  7. 删除计算机文件的几种方法,电脑删除不了文件怎么办?教你几种好的处理方法,一学就会...

    现在是电脑的时代,我们每天都要在计算机上处理大量的文件.但是有的时候,电脑上会出现删不了文件的情况.出现这种情况可能是下面的几种原因. 1.首先检查与文件相关的软件是否正常运行,并且尝试关闭它. 如果 ...

  8. python 去掉文件后缀_python从zip中删除指定后缀文件(推荐)

    一,说明 环境:python2 用到的模块 os zipfile shutil 程序功能:从zip中删除指定后缀的文件,然后再自动压缩 函数说明: DelFileInZip(path,suffix) ...

  9. linux命令删除sh文件,Linux下面使用命令如何运行.sh文件的两种解决办法 删除windows.old文件夹的解决...

    延伸:删除windows.old文件夹的解决办法 描述:...行",这样就以管理员身份运行了cmd. 然后就很简单啦: 1 rd /S /Q c:\windows.old 注意,运行该命令后 ...

  10. js已知文件路径得到file对象_NodeJs 的几种文件路径

    Node 中的文件路径大概有 __dirname, __filename, process.cwd(), ./ 或者 ../,前三个都是绝对路径,为了便于比较,./ 和 ../ 我们通过 path.r ...

最新文章

  1. 学习笔记(十三)——vim编辑与linux命令
  2. 用XGBoost调XGBoost?我调我自己?
  3. 修改选择文件按钮,变成自己设置的样式
  4. 学术圈「超级内卷」:“青椒”难!
  5. 被曝大裁员,涉及30%员工!公司内斗、高管之间拉帮结派 喜茶回应了...
  6. android 串口键盘_侧面滑盖+实体全键盘的安卓手机,能走向大众化吗?
  7. VS2012无法打开文件“kernel32.lib”问题的解决办法
  8. ORACLE RAC 视频教程
  9. 记录一次重装win10系统的流程
  10. 解决Android Studio连接不到ios模拟器问题
  11. macbook黑屏_Macbook苹果笔记本电脑开机黑屏如何解决【解决方法】
  12. python中函数的学习
  13. 《图说区块链》读书笔记
  14. 垃圾收集 (Garbage Collection,GC)
  15. 使用头文件winbase.h的错误
  16. windows下如何查看本机所在局域网内所有可以访问的IP
  17. 如何利用微信进行微信签到呢?
  18. 安卓手机各种信息获取---(通讯录短信息通话记录)
  19. 什么是扩散模型(Diffusion Models)?
  20. 09-多窗口切换-window_handles

热门文章

  1. 用ipv6地址打开samba共享目录
  2. 汇编语言——偏移地址超过有效地址FFFFH
  3. bios 微星click_微星发表全新搭载图形化『Click BIOS』主机板 采用最新UEFI架构 迎接全图形化BIOS调教新时代...
  4. python参数类型为uint8_Python 改变数组类型为uint8的实现
  5. 【Photoshop】批量修改图片分辨率
  6. 【WPS】中插入“公式”后行距不正常的解决办法
  7. html5 获取剪切板内容,H5剪切板功能
  8. SEO关键词产出之词频分析(关键词工具篇)
  9. Latex: 表格内换行
  10. 华为网络计算机登陆,华为路由器如何登录192.168.3.1入口设置界面