【问题标题】:Is there a way to return HTML page from Restful Controller in Spring Boot?有没有办法在 Spring Boot 中从 Restful Controller 返回 HTML 页面?
【发布时间】:2020-09-05 00:47:16
【问题描述】:

我目前正在我的 Spring Boot 项目中进行文件上传。我正在为我的控制器使用休息控制器,因为那是我正在使用的教程中写的 https://www.callicoder.com/spring-boot-file-upload-download-jpa-hibernate-mysql-database-example/

但是,我发现显然休息控制器无法显示基于这里写的 HTML 页面:How to return a html page from a restful controller in spring boot?

有没有办法在保留其余控制器的同时显示我的 HTML 页面?

这是我的控制器

@RestController
public class RekonsiliasiController {

    private static final Logger logger = LoggerFactory.getLogger(RekonsiliasiController.class);

    @Autowired
    private DBFileStorageService dbFileStorageService;

    @RequestMapping("/rekonsiliasi")
    public String index() {
        System.err.println("MASUK PAK EKO OI");
        return "rekonsiliasi";
    }

    @PostMapping("/uploadFile")
    public UploadFileResponse uploadFile(@RequestParam("file") MultipartFile file) {
        DBFile dbFile = dbFileStorageService.storeFile(file);

        String fileDownloadUri = ServletUriComponentsBuilder.fromCurrentContextPath()
                .path("/downloadFile/")
                .path(dbFile.getId())
                .toUriString();

        return new UploadFileResponse(dbFile.getFileName(), fileDownloadUri,
                file.getContentType(), file.getSize());
    }

    @GetMapping("/downloadFile/{fileId}")
    public ResponseEntity<ByteArrayResource> downloadFile(@PathVariable String fileId) {
        // Load file from database
        DBFile dbFile = dbFileStorageService.getFile(fileId);

        return ResponseEntity.ok()
                .contentType(MediaType.parseMediaType(dbFile.getFileType()))
                .header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"" + dbFile.getFileName() + "\"")
                .body(new ByteArrayResource(dbFile.getData()));
    }

}

这是我的 rekonsiliasi.html

 <form method="POST" action="/uploadFile" enctype="multipart/form-data">
                                          <input type="file" name="file" /><br/><br/>
                                          <input type="submit" value="Submit" />
                                      </form>

这是我目前得到的,一个带有简单文本的空白页

更新

我尝试在索引和文件上传到以下之间进行划分。

RekonsiliasiController.java

@Controller
public class RekonsiliasiController {

    @RequestMapping("/rekonsiliasi")
    public String index() {
        System.err.println("MASUK PAK EKO OI");
        return "rekonsiliasi";
    }

文件控制器.java

@RestController
public class FileController {

    private static final Logger logger = LoggerFactory.getLogger(FileController.class);

    @Autowired
    private DBFileStorageService dbFileStorageService;

    @PostMapping("/uploadFile")
    public UploadFileResponse uploadFile(@RequestParam("file") MultipartFile file) {
        System.err.println("CEK");
        DBFile dbFile = dbFileStorageService.storeFile(file);

        String fileDownloadUri = ServletUriComponentsBuilder.fromCurrentContextPath()
                .path("/downloadFile/")
                .path(dbFile.getId())
                .toUriString();

        return new UploadFileResponse(dbFile.getFileName(), fileDownloadUri,
                file.getContentType(), file.getSize());
    }


    @GetMapping("/downloadFile/{fileId}")
    public ResponseEntity<Resource> downloadFile(@PathVariable String fileId) {
        // Load file from database
        DBFile dbFile = dbFileStorageService.getFile(fileId);

        return ResponseEntity.ok()
                .contentType(MediaType.parseMediaType(dbFile.getFileType()))
                .header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"" + dbFile.getFileName() + "\"")
                .body(new ByteArrayResource(dbFile.getData()));
    }

}

现在 HTML 显示得非常好,但是当我上传文件时出现 403 错误。在我试图找到这部分的问题之前,我想知道是否有一些方法可以在保留其余控制器的同时显示我的 HTML 页面?

编辑删除 FileController.Java 中的 'uploadMultipleFiles' 方法,它仍然给我 403 错误

【问题讨论】:

    标签: java spring spring-boot rest


    【解决方案1】:

    首先,在您的控制器方法uploadMultipleFiles 的代码中,您实际上是直接调用控制器方法uploadFile,将其视为另一种不理想的方法。您需要递归调用另一个控制器端点这一事实意味着它本身就是一个设计缺陷。因此,尝试通过在服务层中提供处理这种情况的逻辑来删除这部分代码。

    其次,将视图控制器和其余控制器分成两个单独的类是正确的方法。 @RestController 注解设计为默认提供 json 响应,这就是为什么我们有 @Controller 注解,它同时服务于模型和视图。您收到的响应码 403 与此无关。

    【讨论】:

    • 哦,我发这个帖子是我的错。我已经删除了 uploadMultipleFiles 方法,它仍然以 403 错误结束
    • 您是否添加了任何日志或尝试调试以了解它返回 403 的原因。您的请求是否到达您的端点?
    • 当我提交上传的文件时,它成功地将链接引导到/uploadFile 但是显然在我再次检查后 - 显然它没有进入uploadFile的方法
    • 能否检查一下yoiu发起的请求,验证请求中的multipart文件和其他参数是否正确?
    • @Gagak 如果您在安全中启用它,还需要在请求中添加 csrf 令牌。它将解决您的问题。
    猜你喜欢
    • 2021-05-25
    • 2016-12-06
    • 1970-01-01
    • 2014-05-03
    • 1970-01-01
    • 2021-10-26
    • 1970-01-01
    • 2018-07-11
    • 1970-01-01
    相关资源
    最近更新 更多