Spring Boot REST API返回文件列表

3b6akqbq  于 2022-10-23  发布在  Spring
关注(0)|答案(3)|浏览(260)

我正在尝试从目录返回文件列表。以下是我的代码:

package com.demo.web.api.file;

import java.io.File;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import com.demo.core.Logger;

import io.swagger.v3.oas.annotations.Operation;

@RestController
@RequestMapping(value = "/files")
public class FileService {

    private static final Logger logger = Logger.factory(FileService.class);

    @Value("${file-upload-path}")
    public String DIRECTORY;

    @Value("${file-upload-check-subfolders}")
    public boolean CHECK_SUBFOLDERS;

    @GetMapping(value = "/list")
    @Operation(summary = "Get list of Uploaded files")
    public ResponseEntity<List<File>> list() {

        List<File> files = new ArrayList<>();

        if (CHECK_SUBFOLDERS) {

            // Recursive check
            try (Stream<Path> walk = Files.walk(Paths.get(DIRECTORY))) {
                List<Path> result = walk.filter(Files::isRegularFile).collect(Collectors.toList());

                for (Path p : result) {
                    files.add(p.toFile().getAbsoluteFile());
                }
            } catch (Exception e) {

                logger.error(e.getMessage());

            }

        } else {

            // Checks the root directory only.
            try (Stream<Path> walk = Files.walk(Paths.get(DIRECTORY), 1)) {
                List<Path> result = walk.filter(Files::isRegularFile).collect(Collectors.toList());

                for (Path p : result) {
                    files.add(p.toFile().getAbsoluteFile());
                }
            } catch (Exception e) {

                logger.error(e.getMessage());

            }

        }

        return ResponseEntity.ok().body(files);

    }

}

如代码所示,我正在尝试返回一个文件列表
然而,当我在Postman中测试时,我得到了一个字符串列表

如何让它返回文件对象而不是文件路径字符串?我需要获取文件属性(大小、日期等)显示在我的视图中。

13z8s7eq

13z8s7eq1#

我建议您更改ResponseEntity<>,返回的不是文件列表,而是资源列表,然后您可以使用它来获取所需的文件元数据。

public ResponseEntity<List<Resource>> list() {}

您还可以尝试在@Getmap注解中指定produces=MediaType...参数,以便告诉HTTP封送处理程序需要哪种内容。

8oomwypt

8oomwypt2#

您必须创建一个单独的有效负载,其中包含您想要回应的细节。

public class FilePayload{
       private String id;
       private String name;
       private String size;

       public static fromFile(File file){
         // create FilePayload from File object here
        }

     }

并使用Map器将其从内部DTO对象转换为有效负载对象。

final List<FilePayload> payload = files.forEach(FilePayload::fromFile).collect(Collectors.toList());

return new ResponseEntity<>(payload, HttpStatus.OK);

我认为在这种情况下你不应该退还身体,因为你可能不知道身体的大小。最好将另一个端点设置为GET/files/{id}

nimxete2

nimxete23#

我确实重新考虑过这一点。我只需要文件名和文件大小。从那里,我可以获得文件扩展名,并使我的列表显示已经很好了。
以下是重构后的方法:

@GetMapping(value = "/list")
@Operation(summary = "Get list of Uploaded files")
public ResponseEntity<Map<String, Map<String, String>>> list() {

    Map<String, String> filesWithSize = new HashMap<>();
    Map<String, Map<String, String>> response = new HashMap<>();

    try (Stream<Path> walk = Files.walk(Paths.get(DIRECTORY), CHECK_SUBFOLDERS ? 1000 : 1)) {
        List<Path> result = walk.filter(Files::isRegularFile).collect(Collectors.toList());
        for (Path p : result) {
            filesWithSize.put(p.toFile().getAbsolutePath(), new Long(p.toFile().length()).toString());
        }
        response.put("data", filesWithSize);

    } catch (Exception e) {
        String errMsg = CoreUtils.formatString("%s: Error reading files from the directory: \"%s\"",
                e.getClass().getName(), DIRECTORY);
        logger.error(e, errMsg);
        filesWithSize.put("message", errMsg);
        response.put("errors", filesWithSize);
    }

    return ResponseEntity.ok().body(response);

}

我最后做的是在请求成功时返回一个文件列表及其大小,如果请求失败则返回错误。这让我感觉好多了。

相关问题