SpringBoot默认的访问目录默认是resource下,我们要想访问服务包之外的文件需要自定义,下面我们以文件上传访问作为载体……
1 定义文件访问url
Java代码动态实现Handler映射注册
代码语言:javascript复制@Component
class ResourceConfig : WebMvcConfigurerAdapter() {
@Value("${twins.staticAccessPath}")
lateinit var staticAccessPath: String
@Value("${twins.uploadFolder}")
lateinit var uploadFolder: String
override fun addResourceHandlers(registry: ResourceHandlerRegistry) {
super.addResourceHandlers(registry)
registry.addResourceHandler(staticAccessPath)
.addResourceLocations("file:" uploadFolder)
}
}
yml配置动态属性
代码语言:javascript复制twins:
#静态资源对外暴露的访问路径
staticAccessPath: /upload/**
#静态文件存储路径(最后带/ 访问路径 upload/xxx/xxx)
#最后路径不带/ 需要把最后文件夹添加 访问路径 upload/doc/xxx/xx
uploadFolder: /Users/sk/doc/
上面Java代码和配置文件结合实现了 url与Handler注册,以及存储文件访问路径
2实现文件上传
代码语言:javascript复制 @Value("${twins.uploadFolder}")
lateinit var docLocation: String
@PostMapping("/upload")
@ResponseBody
public fun uploadImage(@RequestParam("file") file: MultipartFile, request: HttpServletRequest): Response<Image> {
if (file.isEmpty) {
return Response(ResponseCode.Custom, null, "图片文件不能为空")
}
var fileName = file.originalFilename
var suffixName = fileName.substring(fileName.lastIndexOf("."))
var filePath = docLocation
fileName = UUID.randomUUID().toString() suffixName
var fileUrl = "/" request.session.id "/" fileName
filePath = filePath fileUrl
var dest = File(filePath)
if (!dest.parentFile.exists()) {
dest.parentFile.mkdirs()
}
file.transferTo(dest)
return Response(ResponseCode.Success, Image(fileUrl), "success")
}
我们看看响应
代码语言:javascript复制data class Response<T>(val code: ResponseCode = ResponseCode.Success, val data: T?, val msg: String?) {
}
enum class ResponseCode{
Success,
Failure,
Custom
}
我们采用枚举,这个在Java中与很大打区别,枚举直接可以与INt映射转化
3 访问查看
文件访问的公式:ip:port/url 文件相对路径
以我们的配置为例
文件的绝对路径:/Users/sk/doc/
映射Handler的url为:/upload/**
那么组合起来就是
ip:port/upload/xxx.png
此处值的注意的是对于文件访问的路径设置
/Users/sk/doc/
/Users/sk/doc
而这看似相同是则区别很大:对于/Users/sk/doc来说最后的doc需要出现在文件的url访问路径中----ip:port/upload/doc/xxxx.png
总结:
总的来说差异不是很大需要去熟悉语法的不适应,当然了Kotlin中的协成高级函数我们还没有体验到,后续根据Kotlin的学习之后我们进行语法实践之后完善我们的Kotlin小项目达到融汇贯通