Загрузить файл в базу данных - PullRequest
0 голосов
/ 29 октября 2018

У меня есть база данных mysql, куда я хочу загрузить изображение с помощью SpringMVC и Thymeleaf. Я не использую Spring boot.

PhotoController:

@RequestMapping(value = "/form", method = RequestMethod.GET)
    public String form() {

        return "form";
    }


    @RequestMapping(value = "/doUp", method = RequestMethod.GET)
    public String subirFoto(@RequestParam("file") File file) {

                byte[] imageData = new byte[(int) file.length()];

                try {
                    FileInputStream fileInputStream = new FileInputStream(file);
                    fileInputStream.read(imageData);
                    fileInputStream.close();
                } catch (Exception e) {
                    e.printStackTrace();
                }

                Photo image = new Photo();
                image.setNombre("test.jpg");
                image.setFoto(imageData);

                try {
                    photoService.insertPhoto(image);
                } catch (InstantiationException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }

                return "success";
    }

form.html:

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<body>

<h1>Spring Boot file upload example</h1>


<form th:action="@{/doUp}" th:object="${file}" method="get" 
 enctype="multipart/form-data">
    <input type="file" name="file" /><br/><br/>
    <input type="submit" value="Submit" />
</form>

</body>
</html>

Если я меняю метод и пытаюсь загрузить изображение с помощью

File file = new File("/home/Desktop/pokemon.jpg");

работает нормально, но мне нужно загрузить файл с помощью формы.

Я получаю следующую ошибку:

java.io.FileNotFoundException: pokemon.jpg (No existe el archivo o el directorio)
    at java.io.FileInputStream.open0(Native Method)
    at java.io.FileInputStream.open(FileInputStream.java:195)
    at java.io.FileInputStream.<init>(FileInputStream.java:138)
    at com.myproject.controller.PhotoController.subirFoto(PhotoController.java:90)

Я могу понять, что проблема в пути к изображению, но я не знаю, кто это исправит ...

1 Ответ

0 голосов
/ 31 октября 2018

Почему бы не использовать Spring Content JPA ? Это может обеспечить службу хранения и конечные точки REST для управления контентом и, если вы хотите, связать этот контент с объектами JPA.

pom.xml

   <!-- Java API -->
   <dependency>
      <groupId>com.github.paulcwarren</groupId>
      <artifactId>spring-content-jpa</artifactId>
      <version>0.4.0</version>
   </dependency>
   <!-- REST API -->
   <dependency>
      <groupId>com.github.paulcwarren</groupId>
      <artifactId>spring-content-rest</artifactId>
      <version>0.4.0</version>
   </dependency>

Конфигурация

@Configuration
@EnableJpaStores
@Import(RestConfiguration.class) // enable Spring Content Rest
public class MysqlConfig {

  // Initialize the database schema
  //
  @Value("/org/springframework/content/jpa/schema-drop-mysql.sql")
  private Resource dropReopsitoryTables;

  @Value("/org/springframework/content/jpa/schema-mysql.sql")
  private Resource dataReopsitorySchema;

  @Bean
  DataSourceInitializer datasourceInitializer() {
    ResourceDatabasePopulator databasePopulator =
            new ResourceDatabasePopulator();

    databasePopulator.addScript(dropReopsitoryTables);
    databasePopulator.addScript(dataReopsitorySchema);
    databasePopulator.setIgnoreFailedDrops(true);

    DataSourceInitializer initializer = new DataSourceInitializer();
    initializer.setDataSource(dataSource());
    initializer.setDatabasePopulator(databasePopulator);

    return initializer;
  }
}

Создать "магазин":

ImagesStore.java

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

Это все, что вам нужно для создания конечных точек REST @ /images. Когда ваше приложение запускается, Spring Content проверяет ваши зависимости (см. Spring Content JPA & REST), просматривает ваш интерфейс ImagesStore и внедряет реализацию этого интерфейса для JPA. Он также внедрит @Controller, который перенаправляет http-запросы в эту реализацию. Это избавляет вас от необходимости реализовывать все это самостоятельно, что, я думаю, то, что вы ищете.

Итак ...

curl -X POST /images/pokemon.jpg -F "image = @ / home / Desktop / pokemon.jpg"

сохранит изображение в базе данных (как BLOB).

curl /images/pokemon.jpg

получит его снова и так далее ... поддерживает полный CRUD.

Есть пара руководств по началу работы здесь . Справочное руководство здесь . И здесь есть обучающее видео здесь . Кодовый бит начинается примерно на полпути.

НТН

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...