如何在Spring Boot中将页面重定向到静态文件?

4
我该如何将Spring Boot(MVC)中的页面网页请求/请求映射重定向到指向静态文件(例如:.txt,.json,.jpg,.mp4等)?在我的Spring Boot项目中,我只有一个application.properties文件和@Controllers。
当用户在浏览器中发出网页请求时,我希望他们被要求下载文件(而不是像使用.html或.jsp一样尝试呈现页面)。

1
当用户点击链接时下载文件?你是指“重定向到静态文件”吗? - Vinay Veluri
2个回答

4
您可以通过告诉响应您希望附加可下载文件来实现此功能。然后,您可以简单地编写要使其可下载的内容。
以下是一个示例:
@ResponseStatus(HttpStatus.OK)
@RequestMapping(value = "/myredirect", method = RequestMethod.GET, produces = MediaType.APPLICATION_OCTET_STREAM_VALUE)
public void downloadFile(HttpServletResponse response) {
    // Remove this instruction if you wish to disable the download dialog.
    response.setHeader("Content-Disposition", "attachment; filename=filename.ext");

    // Load your file content as byte.
    byte[] fileContent = IOUtils.toByteArray(new ClasspathResource("myfile").getIntputStream());

    response.getOutputStream().write(fileContent);
}

另一方面,如果您只想将内容直接映射到静态文件,则可以使用Spring Boot Starter Web的默认public文件夹。

任何在classpath:/public中找到的文件都将默认映射到/*


1
你好,我已更新我的代码片段以回答你的问题。你需要从RequestMapping值中定义你的重定向URL。然后按照你的意愿从类路径或绝对路径加载文件作为字节数组。祝你好运。如果你想要移除下载行为,只需移除setHeader代码片段即可。 - Daniel Lavoie
谢谢!我会试一下的! - code
我已经再次阅读了您的评论,我认为您没有理解任何在类路径的公共文件夹中可用的资源都将从根路径中提供。例如:public/img/logo.png 中的文件将可从网址 www.mysite.com/img/logo.png 中获取。如果您希望使用自定义 URL,则可以使用请求映射。 - Daniel Lavoie

4
你可以使用Spring中的“redirect:”前缀进行重定向。来自Spring文档

类似于redirect:/myapp/some/resource的逻辑视图名称将相对于当前Servlet上下文进行重定向,而类似于redirect:http://myhost.com/some/arbitrary/path的名称将重定向到绝对URL。

一个示例是:
@RequestMapping("/redirectToResource")
protected String redirect(@RequestParameter("resource") String resource) {
    return "redirect:/myapp/some/" + resource;
}

您可以将静态资源放置在类路径中的任何一个位置,以便直接提供服务(请参见提供静态资源)。
private static final String[] CLASSPATH_RESOURCE_LOCATIONS = {
    "classpath:/META-INF/resources/", "classpath:/resources/",
    "classpath:/static/", "classpath:/public/" };

1
如果我错了,请更正,但是使用“redirect:”会导致重写最终用户到达的URL。我不确定这种行为是否是期望的。它还限制了只能提供已经可用作静态资源的资源。 - Daniel Lavoie
1
是的,它会导致浏览器重定向。要动态加载文件,您可以始终将@RequestParameter作为方法参数传入。是的,Spring Boot将该文件作为静态资源提供服务。 - Willy du Preez

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接