如何使用Java Spring服务于动态创建的文件?

时间:2019-06-03 13:55:41

标签: java spring spring-boot spring-mvc model-view-controller

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

通常的想法是:1个用户有1个文件夹(例如,在resources / files文件夹内部)(我们将其命名为folder1232)。在此文件夹中,生成了他的特定js文件(例如111.js)。因此,我希望他能够通过请求app.com/files/folder1232/111.js URL来访问他的文件。这样做的方式是什么? 如果有不清楚的地方,请告诉我。

我目前正在使用resources文件夹以了解其一般工作方式。我看到的是文件在启动时是以某种方式映射的(例如,如果我在运行时创建带有文件的新文件夹,则在重新启动应用程序之前无法访问该文件)。 我也尝试过使用WebMvcConfigurer,但我想我缺少基本的东西。

@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());
    }
}

我希望从浏览器访问新创建的文件(在运行时)。 如果我也能够访问新创建的文件夹(在运行时),也将是完美的。 但是atm我必须重新启动应用程序才能访问新创建的文件和文件夹。

更新: 接下来我要做的是在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函数中的最后一个斜杠,如果没有它,映射将无法工作(至少对我没有帮助)。

2 个答案:

答案 0 :(得分:0)

首先, 了解您实际要解决的问题。 不要只是跳到“我想要这个解决方案”。

您要解决的问题似乎是这样的:

  1. 我的应用程序将“创建”一些副本(副本是文本的通用术语,其中包括您的.js文件)。
  2. 所说的副本将通过一些唯一的标识符公开寻址。

以上两个要求均不要求您在任何地方创建文件。

一个简单的解决方案是: 在下面的解决方案中,“行”可以正好是一行,也可以是1个或更多行的有序集合。

  1. 在包含要提供的“副本”的表中创建一行。
  2. 使用唯一值标识该行。
  3. [可选]创建一个表,以在该行的可读名称(又名文件名)和该行的唯一标识符之间进行转换。
  4. 创建一个REST服务以按人类可读的名称获取行。

答案 1 :(得分:-1)

那么对我特别有用的是: 我创建了一个文件夹来存储项目外的文件。 例如/ Users /%username%/ Documents / fileFold

并将我的addResourceHandlers函数更改为

registry.addResourceHandler("/files/**")
                .addResourceLocations("file:/Users/%username%/Documents/fileFold/")
                .setCachePeriod(0)
                .resourceChain(true)
                .addResolver(new PathResourceResolver());

注意:请不要忘记addResourceLocations函数中的最后一个斜杠,没有它,映射将无法工作(至少对我没有帮助)。