spring—如何将这个方法从使用java.io.file转换为java.nio.file?

4xrmg8kj  于 2021-07-13  发布在  Java
关注(0)|答案(3)|浏览(538)

基本上我有一个从教程中得到的方法(我的主要目标是简单地从spring引导服务器返回图像,这样我就可以动态地查看它们)

@RestController
public class FileController {

    @Autowired
    ServletContext context;

    @GetMapping(path = "/allImages")
    public ResponseEntity<List<String>> getImages(){
        List<String> images = new ArrayList<String>();
        String filesPath = context.getRealPath("/images");
        File fileFolder = new File(filesPath);
        if(fileFolder!=null) {
            for(final File file : fileFolder.listFiles()) {
                if(!file.isDirectory()) {
                    String encodeBase64 = null;
                    try {
                        String extention = FilenameUtils.getExtension(file.getName());
                        FileInputStream fileInputStream = new FileInputStream(file);
                        byte[] bytes = new byte[(int)file.length()];
                        encodeBase64 = Base64.getEncoder().encodeToString(bytes);
                        images.add("data:image/"+extention+";base64,"+encodeBase64);
                        fileInputStream.close();
                    } catch (Exception e) {
                        // TODO: handle exception
                    }
                }
            }
        }
        return new ResponseEntity<List<String>>(HttpStatus.OK);
    }

使用当前代码,当我尝试返回文件时,我得到:

java.lang.NullPointerException: Cannot read the array length because the return value of "java.io.File.listFiles()" is null

我四处搜索,发现人们推荐使用 java.nio.file 相反,我有点迷茫我该如何实现这一点。感谢您的帮助。

93ze6v8z

93ze6v8z1#

nio示例:

public List<String> readImages() throws IOException {
    return Files.list(Path.of("/images"))
            .filter(Files::isRegularFile)
            .map(this::encode)
            .filter(Objects::nonNull)
            .collect(Collectors.toList());
  }

  private String encode(Path file) {
    try {
      String extension = FilenameUtils.getExtension(file.getFileName().toString());
      String encodeBase64 = Base64.getEncoder().encodeToString(Files.readAllBytes(file));
      return "data:image/"+extension+";base64,"+encodeBase64;
    } catch (Exception e) {
      return null;
    }
  }
ymzxtsji

ymzxtsji2#

先拿一个 Path 到您的文件夹:

Path folderPath = Paths.get(filesPath);

如果你的 Path 指向一个目录,就可以得到一个 Stream<Path> 其内容使用 Files.list :

if (Files.isDirectory(folderPath)) {
    List<Path> files = Files.list(folderPath)
         .filter(path -> !Files.isDirectory(path))
         .collect(Collectors.toList());

    // Do something with the files.
}

看起来你不是在用 FileInputStream 所以你不需要翻译那部分。要获取路径的文件扩展名,可能需要将 Path 然后自己提取扩展名。

ma8fv8wu

ma8fv8wu3#

我用这个代码解决了这个问题:

@Autowired
    ServletContext context;

    @GetMapping(path = "/allImages")
    public List<String> readImages() throws IOException {
        return Files.list(Paths.get(context.getRealPath("/images")))
                .filter(Files::isRegularFile)
                .map(this::encode)
                .filter(Objects::nonNull)
                .collect(Collectors.toList());
      }

    private String encode(Path file) {
        try {
          String extension = FilenameUtils.getExtension(file.getFileName().toString());
          String encodeBase64 = Base64.getEncoder().encodeToString(Files.readAllBytes(file));
          return "data:image/"+extension+";base64,"+encodeBase64;
        } catch (Exception e) {
          return null;
        }
      }

感谢所有帮助过你的人。

相关问题