如何使用JavaSpring为动态创建的文件提供服务?
我正在尝试用SpringBoot构建一个应用程序,它将生成文件.js,这些文件必须是公开的。 这些文件创建后应该可以通过我的服务器上的链接访问,并且可以通过链接插入其他人的网站。 类似于“jQuery”或“GoogleAdwords”的工作方式,它们是如何与html脚本标记连接的。 因此,我面临的问题或只是缺乏知识,就是如何动态创建这些文件,并使它们可以公开访问 一般的想法是:1个用户在resources/files文件夹中有1个文件夹,例如,我们将其命名为folder1232。在这个文件夹中,会生成他的特定js文件,例如111.js。所以我希望他能够通过请求app.com/files/folder1232/111.js URL来访问他的文件。怎么做呢? 如果有什么不清楚的地方,请告诉我 我目前正在使用resources文件夹来了解它的工作原理。我看到的是,文件在启动时以某种方式映射,因此,例如,如果我在运行时创建了一个包含文件的新文件夹,则在我重新启动应用程序之前无法访问该文件夹。 我还尝试使用WebMVCConfiguer,但我认为我缺少一些基本的东西如何使用JavaSpring为动态创建的文件提供服务?,java,spring,spring-boot,spring-mvc,model-view-controller,Java,Spring,Spring Boot,Spring Mvc,Model View Controller,我正在尝试用SpringBoot构建一个应用程序,它将生成文件.js,这些文件必须是公开的。 这些文件创建后应该可以通过我的服务器上的链接访问,并且可以通过链接插入其他人的网站。 类似于“jQuery”或“GoogleAdwords”的工作方式,它们是如何与html脚本标记连接的。 因此,我面临的问题或只是缺乏知识,就是如何动态创建这些文件,并使它们可以公开访问 一般的想法是:1个用户在resources/files文件夹中有1个文件夹,例如,我们将其命名为folder1232。在这个文件夹中,
@Configuration
@EnableWebMvc
public class MvcConfig implements WebMvcConfigurer {
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/files/**")
.addResourceLocations("file:/files/")
.setCachePeriod(3600)
.resourceChain(true)
.addResolver(new PathResourceResolver());
}
}
我希望在运行时从浏览器访问新创建的文件。
如果我也能在运行时访问新创建的文件夹,那就太完美了。
但是我必须重新启动一个应用程序来访问新创建的文件和文件夹
更新:
我接下来要做的是在我的java项目之外创建一个文件夹。
如下所示:/Users/%username%/Documents/fileFold
并将我的addResourceHandler函数更改为:
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/files/**")
.addResourceLocations("file:/Users/%username%/Documents/fileFold/")
.setCachePeriod(0)
.resourceChain(true)
.addResolver(new PathResourceResolver());
}
现在它工作得很好。谢谢大家!
注意:不要忘记addResourceLocations函数中的最后一个斜杠,没有它映射将无法工作至少对我不起作用。首先,
了解您实际试图解决的问题。
不要直接跳到我想要的解决方案
您试图解决的问题似乎是:
我的应用程序将创建一些副本。副本是文本的通用术语,包括你的.js文件。
所述副本可通过某种唯一标识符公开寻址。
上述两项要求都不要求您在任何地方创建文件
一个简单的解决方案是:
在下面的解决方案中,行可以是一行,也可以是一行或多行的有序集合
在包含要提供的副本的表中创建一行。
使用唯一值标识行。
[可选]创建一个表,以便在人类可读名称(即行的文件名)和所述行的唯一标识符之间进行转换。
创建一个REST服务,以按人类可读的名称获取行。
那么什么对我特别有效: 我创建了一个文件夹来存储项目外部的文件。 e、 g./Users/%username%/文档/fileFold 并将我的addResourceHandlers函数更改为
registry.addResourceHandler("/files/**")
.addResourceLocations("file:/Users/%username%/Documents/fileFold/")
.setCachePeriod(0)
.resourceChain(true)
.addResolver(new PathResourceResolver());
注意:不要忘记addResourceLocations函数中的最后一个斜杠,没有它映射将无法工作至少对我来说不起作用。不要将应用程序中的文件与用户数据混合使用这几乎是重复的,您必须重新启动应用程序,因为resources文件夹是项目的一部分,它是在启动之前构建的。这不是@Jens指出的动态生成文件的地方,尤其不是用户操作生成的文件。您应该使用项目结构之外的专用文件夹。Spring Boot中的默认设置是认为应用程序的当前工作目录,因此,如果您新建了FileuserFiles/folder1232.mkdirs或类似的文件,则将在当前工作目录中创建此文件夹。您必须更改方法:1。对于真实文件,您应该使用nginx或apache,禁用缓存Spring boot并不是为静态文件服务器设计的,2。但是,如果您的文件是通过java生成的,请将其作为普通资源使用,而不是使用resourceHandler。@pdem如果我在WebMvcConfigurer继承器中使用registry.setCachePeriod0,这还不够吗?