三、WebFlux 上传、下载、展示

三、WebFlux上传、下载、展示

一、文件上传

   一个真实案例中,文件传到服务器后,要继续上传到 OSS,经实测 transferTo 的方案更完美。DataBufferUtils 的方案,传到服务器没问题,但继续上传到 OSS 后,图片总是只有上半身。

/**
 * 文件上传
 */
@ApiOperation("轮播图 - 上传")
@PostMapping("/admin/chart/upload", consumes = [MediaType.MULTIPART_FORM_DATA_VALUE])
fun handleFileUpload(@RequestPart("file") filePart: Mono<FilePart>): Mono<Status> {
    return filePart.map {
        val tempFilePath = Files.createTempFile("chart-", it.filename())
        // NOTE 方法一
        it.transferTo(tempFilePath.toFile()).let {
            val result = minioTemplate.putObject("chart/${tempFilePath.fileName}", tempFilePath)
            Status.Ok(result)
        }
        // NOTE 方法二
        // val channel = AsynchronousFileChannel.open(tempFilePath, StandardOpenOption.WRITE)
        // DataBufferUtils.write(it.content(), channel, 0).subscribe().let {
        //     val result = minioTemplate.putObject("chart/${tempFilePath.fileName}", tempFilePath)
        //     Status.Ok(result)
        // }
    }
}

二、文件下载

/**
 * Html、Video ok
 */
@GetMapping("/icloud/{id}/{fileName}")
fun ReadFile(@PathVariable id: Long, response: ServerHttpResponse): Mono<*> {
    response.headers.set("Content-Disposition", "attachment; filename=$fileName")   // 强制为下载
    return Mono.just(FileSystemResource("/Users/xxx/Downloads/$fileName"))
}

   支持断点续传,视频文件还支持 记忆播放(测试软件 IINA)。

三、文件显示

@GetMapping("/icloud/{id}/{fileName}")
fun showFile(@PathVariable id: Long, response: ServerHttpResponse): Mono<*> {
  return icloudFileBS.getFile(id).map {
    it.fullPath?.let { fullPath ->
			response.headers.contentType = when (it.suffixName) {
				"png", "jpg", "jpeg" -> MediaType.IMAGE_PNG
				"htm", "html"        -> MediaType.TEXT_HTML
				"pdf",               -> MediaType.APPLICATION_PDF
				else                 -> MediaType.APPLICATION_PROBLEM_JSON
			}
			FileSystemResource(fullPath)
		} ?: Status.BadRequest("没有文件路径信息")
  }.defaultIfEmpty(Status.BadRequest("文件不存在!"))
}

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值