Создать URL для загруженного файла - PullRequest
0 голосов
/ 09 февраля 2019

Я создаю простое веб-приложение, используя Spring MVC.В этом приложении я написал код для загрузки файла на сервер (папка 'target'). Файлы загружаются на сервер без каких-либо проблем.Теперь я хочу создать 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 голосов
/ 09 февраля 2019

Вы также можете использовать встроенную функцию сервера для сопоставления URL-адресов с файловой системой.Зависит от того, какое приложение или веб-сервер вы используете.

Для Tomcat найдите такую ​​конфигурацию в файле server.xml:
<Context docBase="/my/files/folder" path="/get-file" />

И никакого кодирования вообще не требуется!

0 голосов
/ 11 февраля 2019

Другой вариант - использовать 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());
    }

}

NB: иеще проще, если вы используете Spring Boot.

FileStore.java

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

И все.FileStore - это по сути универсальный Spring ResourceLoader.Зависимость spring-content-fs заставит Spring Content внедрить реализацию на основе файловой системы, поэтому вам не нужно беспокоиться о ее реализации самостоятельно.Более того, зависимость spring-content-rest заставит Spring Content также внедрить реализацию, если @Controller, который перенаправляет HTTP-запросы в метод FileStore.

Таким образом, теперь у вас будет полнофункциональная (POST, PUT, GET, DELETE) файловая служба на основе REST на /files, которая будет использовать вашу FileStore для извлечения (и сохранения) файлов в /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 и сохранит его в /path/to/your/files/ на вашем сервере.

HTH

0 голосов
/ 09 февраля 2019

Поскольку мы не знаем, какой тип файла вы хотите вернуть, вы можете использовать возврат 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:

<dependency>
    <groupId>commons-io</groupId>
    <artifactId>commons-io</artifactId>
    <version>2.6</version>
</dependency>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...