我正在尝试从目录返回文件列表。以下是我的代码:
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中测试时,我得到了一个字符串列表。
如何让它返回文件对象而不是文件路径字符串?我需要获取文件属性(大小、日期等)显示在我的视图中。
3条答案
按热度按时间13z8s7eq1#
我建议您更改ResponseEntity<>,返回的不是文件列表,而是资源列表,然后您可以使用它来获取所需的文件元数据。
您还可以尝试在@Getmap注解中指定
produces=MediaType...
参数,以便告诉HTTP封送处理程序需要哪种内容。8oomwypt2#
您必须创建一个单独的有效负载,其中包含您想要回应的细节。
并使用Map器将其从内部DTO对象转换为有效负载对象。
我认为在这种情况下你不应该退还身体,因为你可能不知道身体的大小。最好将另一个端点设置为
GET
/files/{id}
nimxete23#
我确实重新考虑过这一点。我只需要文件名和文件大小。从那里,我可以获得文件扩展名,并使我的列表显示已经很好了。
以下是重构后的方法:
我最后做的是在请求成功时返回一个文件列表及其大小,如果请求失败则返回错误。这让我感觉好多了。