Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/364.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用JavaSpring为动态创建的文件提供服务?_Java_Spring_Spring Boot_Spring Mvc_Model View Controller - Fatal编程技术网

如何使用JavaSpring为动态创建的文件提供服务?

如何使用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。在这个文件夹中,

我正在尝试用SpringBoot构建一个应用程序,它将生成文件.js,这些文件必须是公开的。 这些文件创建后应该可以通过我的服务器上的链接访问,并且可以通过链接插入其他人的网站。 类似于“jQuery”或“GoogleAdwords”的工作方式,它们是如何与html脚本标记连接的。 因此,我面临的问题或只是缺乏知识,就是如何动态创建这些文件,并使它们可以公开访问

一般的想法是:1个用户在resources/files文件夹中有1个文件夹,例如,我们将其命名为folder1232。在这个文件夹中,会生成他的特定js文件,例如111.js。所以我希望他能够通过请求app.com/files/folder1232/111.js URL来访问他的文件。怎么做呢? 如果有什么不清楚的地方,请告诉我

我目前正在使用resources文件夹来了解它的工作原理。我看到的是,文件在启动时以某种方式映射,因此,例如,如果我在运行时创建了一个包含文件的新文件夹,则在我重新启动应用程序之前无法访问该文件夹。 我还尝试使用WebMVCConfiguer,但我认为我缺少一些基本的东西

@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,这还不够吗?