当前位置: 首页 > 知识库问答 >
问题:

使用Spring Boot和Spring MVC从文件系统中的任何位置提供文件

弘阳德
2023-03-14

我正在尝试制作一个web应用程序,您可以上传保存在我的文件系统中的图像,然后在某个地址(有点像imgur)提供给用户

在图像上传并保存到我的系统中后,我一直很难为其提供服务。有人向我指出,问题可能是当我应该将图像存储在我的项目目标文件夹中时,我将其存储为源树的一部分。现在,我首先将图像存储在project/src/main/resources/static/images中的原因是我无法从其他任何地方在我的网站上提供静态内容。

我已经搜索和阅读了几天了,但我还没有找到任何适用的解决方案。这类问题的答案通常涉及到我的项目没有的文件(如application-servlet.xml或web.xml),以及我以前从未使用过的文件(通常我对Spring、Spring Boot和Java web开发非常陌生)。

我的项目的基础是由github上的导师制作的,然后我克隆了它,包括Application.java所以我看到的使用Spring配置的解决方案也不适合。

以下是我的项目的(希望相关)部分:

这是我的申请。java文件。我什么都没做,它与我克隆的原始github中的文件完全相同。

package project;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.context.web.SpringBootServletInitializer;

/**
 * The main class of the project.
 * By running the main class of {@link Application} then you start the Spring Boot system
 */
@SpringBootApplication
public class Application extends SpringBootServletInitializer{

    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder applicationBuilder){
        return applicationBuilder.sources(Application.class);
    }

    public static void main(String[] args) {
        SpringApplication.run(Application.class,args);
    }

}

这是我的application.properties.这里我刚刚添加了数据库的东西:

spring.view.prefix=/WEB-INF/jsp/
spring.view.suffix=.jsp
multipart.maxFileSize=-1
debug=true

spring.datasource.url=jdbc:postgresql://localhost:5432/finaltest
spring.datasource.username=myusername
spring.datasource.password=mypassword

这是我的pom.xml(我项目中唯一的xml文件)。在这里我刚刚添加了数据库依赖项:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>HBV501G</groupId>
    <artifactId>Spring_Web_html" target="_blank">MVC</artifactId>
    <version>0.1</version>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.2.5.RELEASE</version>
    </parent>

    <dependencies>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-tomcat</artifactId>
        </dependency>

        <dependency>
            <groupId>org.apache.tomcat.embed</groupId>
            <artifactId>tomcat-embed-jasper</artifactId>
        </dependency>

        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>jstl</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>

        <dependency>
            <groupId>org.postgresql</groupId>
            <artifactId>postgresql</artifactId>
            <version>9.4-1200-jdbc41</version>
        </dependency>

    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

我自己做的项目的其余部分,从我的UploadController开始。它只是从发布请求中获取文件、标签和类型,将当前文件以随机生成的名称写入文件系统中的某个位置,并将有关文件的信息(类型、标签、名称及其在文件系统中的位置)存储在数据库中:

package project.controller;

import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.util.List;
import java.util.Random;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.multipart.MultipartFile;
import project.service.MediaFile;
import project.service.MediaFileRepository;

@Controller
public class UploadController {
    private final String AB = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    private Random rnd = new Random();
    private int randomLength = 8;

    @Autowired
    private MediaFileRepository repository;

    @RequestMapping(value = "/uploadmedia", method = RequestMethod.GET)
    public String uploadForm() {
        return "upload";
    }

    @RequestMapping(value = "/uploadmedia", method = RequestMethod.POST)
    public String uploadSubmit(@RequestParam(value="files[]") MultipartFile[] files,
                               @RequestParam("tags[]") String[] tags, @RequestParam("types[]") String[] types)
    {
        String[] tagsArray;
        MultipartFile file;
        String name;
        String tag;
        String path;
        String type;

        for (int i = 0; i < files.length; i++) {
            file = files[i];
            tagsArray = tags[i].split("\\s+");
            type = types[i];

            name = randomString(randomLength);
            List<MediaFile> nameExists = repository.findByName(name);
            while (nameExists.size() > 0) {
                name = randomString(randomLength);
                nameExists = repository.findByName(name);
            }

            path = "/Users/.../src/main/resources/static/img/" + name + type;
            if (!file.isEmpty()) {
                try {
                    byte[] bytes = file.getBytes();
                    BufferedOutputStream stream =
                            new BufferedOutputStream(new FileOutputStream(new File(path)));
                    stream.write(bytes);
                    stream.close();
                    for (int j = 0; j < tagsArray.length; j++) {
                        tag = tagsArray[j].toLowerCase();
                        repository.save(new MediaFile(name, tag, path, type));
                    }
                    System.out.println("Success!");
                } catch (Exception e) {
                    System.out.println("Failure... " + e.getMessage());
                }
            } else {
                System.out.println("file is empty");
            }
        }
        return "upload";
    }

    private String randomString( int len ){
        StringBuilder sb = new StringBuilder( len );
        for( int i = 0; i < len; i++ )
            sb.append( AB.charAt( rnd.nextInt(AB.length()) ) );
        return sb.toString();
    }
}

...接下来,这是我的MediaController(上传的文件是某种媒体)。它只检查url在数据库中是否有具有相应名称的文件,如果有,则将文件路径发送到媒体。jsp。

package project.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import project.service.MediaFile;
import project.service.MediaFileRepository;

import java.util.List;

/**
 * Created by johannesthorkell on 13.10.2015.
 */

@Controller
@RequestMapping("/media")
public class MediaController {

    @Autowired
    private MediaFileRepository repository;

    @RequestMapping("/{media}")
    public String newMedia(@PathVariable String media, Model model) {
        List<MediaFile> nameExists = repository.findByName(media);
        if (nameExists.size() > 0) {
            MediaFile mediaFile = nameExists.get(0);
            String name = mediaFile.getName();
            String type = mediaFile.getType();
            model.addAttribute("image", "/img/" + name + type);
            return "media";
        }
        return "error";
    }
}

...最后,这是我的媒体。jsp文件。它只是从我的MediaController中获取文件位置,并将其作为img元素的src属性(我用来测试它的文件是图像文件)。

<!DOCTYPE html>

<%@ taglib prefix="spring" uri="http://www.springframework.org/tags"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>

<html lang="en">
    <head>
        <meta charset="utf-8">
        <title>Home</title>
    </head>
        <h1>Media Upload</h1>
        <img src="${image}">
        <div id="links">
            <a href="/uploadmedia">upload media</a>
            <a href="/searchmedia">search media</a>
        </div>
    </body>
</html>

共有1个答案

聂建茗
2023-03-14

您可以创建一个配置bean,如

@Configuration
public class StaticResourceConfiguration extends WebMvcConfigurerAdapter {
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        super.addResourceHandlers(registry);
        registry.addResourceHandler("/**").addResourceLocations("file:///D:/your_image_location/");
    }
}

请务必将bean放在Application所在的同一个包中,或者放在它下面的某个地方,以便自动扫描它

 类似资料:
  • 我在中有一个java桌面应用程序。我使用提供的clean and build命令为项目创建了一个可执行jar文件。通过使用该命令,可以在netBeansProjects//dist/.jar下创建可执行jar文件。我可以在项目路径中使用java-jar.jar从命令行执行这个jar文件。但问题是,当我将这个jar移到netbeans projects文件夹之外(比如说移到桌面并运行jar文件)时,

  • 问题内容: 我必须在根文件系统下的三个主要目录中工作-home /用户名,项目和草稿。我希望我的shell提示显示我在这些顶级目录中的哪个。 这是我正在尝试做的事情: 然后,我将PS1导出为: 不幸的是,这不能按我的意愿工作。我得到了我的提示,当我在我的主目录,但如果我切换到划痕或项目则提示也不会改变。我对bash脚本的理解不是很好,因此,我希望能帮助您纠正我的代码。 问题答案: 每次更改工作目录

  • 本文向大家介绍使用Android系统提供的DownloadManager来下载文件,包括了使用Android系统提供的DownloadManager来下载文件的使用技巧和注意事项,需要的朋友参考一下 在android2.3以后android系统提供了一个系统组件来供其他app调用来下载东西,使用起来非常方便。 例如我们可以拿来下载app的新版本apk,同时在同时注册一个广播接收器来接收下载完成时D

  • 问题内容: 我们曾经有一种从类路径上的文件加载属性的方法: 而且效果很好。但是现在我们要从不在类路径中的系统上的特定文件加载属性。我们希望能够动态加载文件,因此我们使用Java环境变量来填充它。我将在下面给出一个简单的示例: 在Java中: 在Spring XML中: 感谢Luciano的一个想法,我也尝试过这种方法: 我尝试过的一切都失败了。无论我将my.prop.file设置为什么。最热门的歌

  • 我是新春尝试简单的webapp。 使用springboot 2.1.0application.properties如下文件。我在src/main/webapp/WEB-INF/jsp中有jsp文件 我的控制器是。 当我将jsp文件放在/main/resources/META-INF/resources/WEB-INF/jsp中时,它可以正常工作,否则会出现以下错误 pom还具有tomcat嵌入ja

  • 我目前正在Windows服务器上试验Docker容器。我已经创建了许多容器,我想看看它们在主机文件系统中的实际保存位置(如Hyper-V的.vhd文件)。我是否可以查看默认位置,或者使用Docker CLI查找该位置的方法?