标签 java 下的文章

最近写代码时发现将枚举类暴露到 dict 接口时总需要做一些重复的装配工作,于是写了这么个工具类来提供枚举类的自动暴露功能。通过在想要暴露的枚举类属性上引用@DictApi注解,不需要再写额外的逻辑即可将对应枚举类和字段暴露出来。

期望

  1. 添加枚举类时可以低成本或无成本地添加到已有的枚举字典接口,不需要写额外的逻辑
  2. 可以指定枚举类哪些字段是需要暴露的,且可以指定字典接口中的属性别名
  3. 支持私有属性通过公有的Getter()方法获取属性值

实现

- 阅读剩余部分 -

使用 Spring Boot 接收上传的文件,接收到的文件对象为srcFile,目标路径为 /upload/img/fileName.jpg,使用transferTo方法存储到本地:

File dstFile = new File("/upload/img/" + fileName);
srcFile.transferTo(dstFile);

提示目标文件路径不存在:

java.io.IOException: java.io.FileNotFoundException: C:\Users\syf\AppData\Local\Temp\tomcat.6910981657131718308.8080\work\Tomcat\localhost\ROOT\upload\img\5a6acf84e27448be9925959821ca1e90.png (系统找不到指定的路径。)

可以看见封装的transferTo方法自动把相对路径补全到了绝对路径,且是以 Tomcat 容器所在的临时目录为父目录补全的,而我们是想保存到项目的/upload/img/目录下。

解决方法:

不使用MultipartFile.transferTo,把 MultipartFile 对象转字节流后使用 FileOutputStream 手动保存二进制流:

// 这里的actualPath是相对项目根目录的路径
String actualPath = "src/main/webapp/upload/img/" + fileName;
String absolutePath = "/upload/img/" + fileName;

try {
    byte[] srcFileBytes = srcFile.getBytes();
    OutputStream f = new FileOutputStream(actualPath);
    f.write(srcFileBytes);
    f.close();
} catch (FileNotFoundException e) {
    System.out.println("File not found");
    System.out.println(actualPath);
    e.printStackTrace();
    return null;
} catch (IOException e) {
    e.printStackTrace();
    return null;
}
return absolutePath;