创建上传文件的URL

时间:2019-02-09 18:41:17

标签: java spring spring-mvc

我正在使用spring mvc创建一个简单的Web应用程序。在此应用程序中,我将上传文件的代码编写到了服务器(``目标''文件夹)中。文件可以毫无问题地上传到服务器。现在,我想为上传的文件创建一个URL,可以使用该URL直接访问该文件。我怎样才能做到这一点?

这是将文件上传到服务器的代码。

@PutMapping(consumes = MediaType.MULTIPART_FORM_DATA_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
public boolean saveFile(@RequestPart("file") MultipartFile myFile) {

    System.out.println(myFile.getOriginalFilename());
    try {

        String projectPath = new File(this.getClass().getProtectionDomain().getCodeSource().getLocation().toURI()).getAbsolutePath();

        File uploadDir = new File(projectPath + "/uploads");
        uploadDir.mkdir();
        System.out.println(uploadDir.getAbsolutePath());
        myFile.transferTo(new File(uploadDir.getAbsolutePath() + "/" + myFile.getOriginalFilename()));
        System.out.println("File Path " + uploadDir.getAbsolutePath() + "/" + myFile.getOriginalFilename());

        String imgUrl = "../../../../../BackEnd/target/POS-1.0.0/WEB-INF/classes/uploads/" + myFile.getOriginalFilename();

        System.out.println(imgUrl);

        return true;

    } catch (Exception e) {
        e.printStackTrace();
        return false;
    }

}

3 个答案:

答案 0 :(得分:1)

由于我们不知道您要返回的文件类型,因此可以使用RAW返回:

  @GetMapping(value = "/get-file/{filename}", produces = MediaType.APPLICATION_OCTET_STREAM_VALUE)
  public byte[] getFile(@PathVariable String filename) throws IOException {
    File file = new File(
        "../../../../../BackEnd/target/POS-1.0.0/WEB-INF/classes/uploads/" + filename);
    InputStream inputStream = new FileInputStream(file);
    return IOUtils.toByteArray(inputStream);
  }

IOUtils.toByteArray(inputStream)方法来自过度使用的Apache commons IO库:

<dependency>
    <groupId>commons-io</groupId>
    <artifactId>commons-io</artifactId>
    <version>2.6</version>
</dependency>

答案 1 :(得分:0)

您还可以使用内置服务器功能将URL映射到文件系统。取决于您使用的特定应用程序或Web服务器。

对于Tomcat,请在server.xml中查找此类配置:
<Context docBase="/my/files/folder" path="/get-file" />

根本不需要编码!

答案 2 :(得分:0)

另一种选择是使用Spring Content。与其他解决方案相比,它具有多个优点;它为您提供了控制器和服务的实现,因此您不必自己实现它们。在存储上提供抽象,使您可以重构解决方案而无需更改代码。例如,您可以将解决方案移动到云中,并使用诸如S3之类的东西进行存储。它可以与其他项目Spring Data(用于捕获有关您的内容的其他元数据)和Apache Solr(用于在文档内部进行搜索)配对,总体上将为您提供更丰富的应用程序。

添加到您的应用程序很容易。

  

pom.xml

    <!-- Java API -->
    <!-- just change this depdendency if you want to store somewhere else -->
    <dependency>
        <groupId>com.github.paulcwarren</groupId>
        <artifactId>spring-content-fs</artifactId>
        <version>0.6.0</version>
    </dependency>
    <!-- REST API -->
    <dependency>
        <groupId>com.github.paulcwarren</groupId>
        <artifactId>spring-content-rest</artifactId>
        <version>0.6.0</version>
    </dependency>
  

StoreConfig.java

@Configuration
// just change this annotation if you want to store somewhere else
@EnableFilesystemStores
@Import(RestConfiguration.class)
public class EnableFilesystemStoresConfig {

    @Bean
    File filesystemRoot() {
        try {
            return new File("/path/to/your/files");
        } catch (IOException ioe) {}
        return null;
    }

    @Bean
    FileSystemResourceLoader fileSystemResourceLoader() {
        return new FileSystemResourceLoader(filesystemRoot().getAbsolutePath());
    }

}

注意:如果您使用的是Spring Boot,则更加容易。

  

FileStore.java

  @StoreRestResource(path="files")
  public interface FileStore extends Store<String> {
  }

就是这样。 FileStore本质上是一个通用的Spring ResourceLoader。 spring-content-fs依赖性将导致Spring Content注入基于文件系统的实现,因此您不必担心自己实现它。此外,如果spring-content-rest将HTTP请求转发到@Controller的方法上,则FileStore的依赖性将导致Spring Content也注入一个实现。

因此,您现在在/files处可以使用基于REST的全功能(POST,PUT,GET,DELETE)文件服务,该服务将使用您的FileStore来检索(和存储){{ 1}}在您的服务器上。

所以:

/path/to/your/files

将从GET /files/some/file.csv下载file.csv

然后...

/path/to/your/files/some/

将上传curl --upload-file some-other-file.csv /files/some-other-file.csv并将其存储在服务器上的some-other-file.csv中。

HTH