Не удается увидеть актуальный загруженный файл (формат .pdf) в базе данных и почтальоне? - PullRequest
0 голосов
/ 07 апреля 2020

Я пытаюсь создать пользовательскую сущность вместе с данными / файлом (в формате pdf). Загрузить и сохранить в базу данных можно, но когда я получаю пользователя в почтальоне, попробуйте отправить метод запроса get, затем в поле данных покажите некоторые ужасные данные, а также я не могу увидеть мой PDF-файл в моей базе данных.

pom. xml

<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
    <java.version>1.8</java.version>
</properties>

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

    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <scope>runtime</scope>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
        <exclusions>
            <exclusion>
                <groupId>org.junit.vintage</groupId>
                <artifactId>junit-vintage-engine</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
</dependencies>

Класс модели

@Entity(name = "employee")

publi c Сотрудник класса {

@Id
@GeneratedValue
private Integer id;

@Column(nullable = false, length = 30)
private String name;

@Column(nullable = false, length = 30)
private String university;

@Column(nullable = false, length = 30)
private String department;

@Column(nullable = false, length = 2)
private Integer year_of_experience;

@Lob
private byte[] data;

2. Класс Contoller

@GetMapping
public List<Employee> getAllEmployee(){
    return employeeService.getAllEmployee();
}

@GetMapping("{id}")
public Employee getEmployeeById(@PathVariable Integer id){
    return employeeService.getEmployeeById(id);
}

@PostMapping(consumes = MediaType.MULTIPART_FORM_DATA_VALUE,
             produces = MediaType.APPLICATION_JSON_VALUE)
public void addEmployee(@RequestParam("file") MultipartFile file, @RequestParam("emp") String emp ) throws IOException {
    ObjectMapper objectMapper = new ObjectMapper();
    Employee employee = objectMapper.readValue(emp,Employee.class);
    employeeService.addEmployee(employee,file);
}

Класс ServiceImplemention

  @Override
public void addEmployee(Employee employee, MultipartFile file) throws IOException {

    for (int i = 0; i < employee.getExperienceList().size(); i++) {
        Experience experience = employee.getExperienceList().get(i);
        experienceService.addExperience(experience);
    }
  byte[]  temp = file.getBytes();
    InputStream inputStream = new ByteArrayInputStream(temp);
    employee.setData(temp);

    employeeRepostitory.save(employee);
}

Представление почтальона для получения сотрудника.

метод post с заголовком "form-data" и выбором ключа в качестве Файл и следующий ключ - это мой пользовательский ключ entiy как текст. Я также пытаюсь использовать тип контента (applicationaiton / json), но не работающий. Как я могу преобразовать эти неожиданные данные в файл PDF или в какой-нибудь другой формат для просмотра.

"id": 62,
    "name": "raj",
    "university": "ewu",
    "department": "bba",
    "year_of_experience": 3,
    "data": "JVBERi0xLjcNCiW1tbW1DQoxIDAgb2JqDQo8PC9UeXBlL0NhdGFsb2cvUGFnZXMgMiAwIFIvTGFuZyhlbi1VUykgL1N0cnVjdFRyZWVSb290IDkgMCBSL01hcmtJbmZvPDwvTWFya2VkIHRydWU+Pi9NZXRhZGF0YSAyNSAwIFIvVmlld2VyUHJlZmVyZW5jZXMgMjYgMCBSPj4NCmVuZG9iag0KMiAwIG9iag0KPDwvVHlwZS9QYWdlcy9Db3VudCAxL0tpZHNbIDMgMCBSXSA+Pg0KZW5kb2JqDQozIDAgb2JqDQo8PC9UeXBlL1BhZ2UvUGFyZW50IDIgMCBSL1Jlc291cmNlczw8L0ZvbnQ8PC9GMSA1IDAgUj4+L0V4dEdTdGF0ZTw8L0dTNyA3IDAgUi9HUzggOCAwIFI+Pi9Qcm9jU2V0Wy9QREYvVGV4dC9JbWFnZUIvSW1hZ2VDL0ltYWdlSV0gPj4vTWVkaWFCb3hbIDAgMCA2MTIgNzkyXSAvQ29udGVudHMgNCAwIFIvR3JvdXA8PC9UeXBlL0dyb3VwL1MvVHJhbnNwYXJlbmN5L0NTL0RldmljZVJHQj4+L1RhYnMvUy9TdHJ1Y3RQYXJlbnRzI

1 Ответ

0 голосов
/ 10 апреля 2020

Вам стоит взглянуть на проект сообщества Spring Content . Этот проект дает вам Spring Data-подобный подход к контенту. Именно для неструктурированных данных (документов, изображений, видео и т. Д. c) Spring Data предназначен для структурированных данных.

Вы можете добавить его в свой проект примерно так: -

pom. xml

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

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

@Configuration
@EnableJpaStores
// enable REST API
@Import("org.springframework.content.rest.config.RestConfiguration.class") 
public class ContentConfig {
}

Примечание: технически эта конфигурация не требуется при использовании стартеров Spring Boot, но включена для ясности

Чтобы связать контент, добавьте аннотации Spring Content на ваш счет *

@StoreRestResource
public interface EmployeeContentStore extends ContentStore<Employee, String> {
}

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

Тогда ...

curl -X POST /employees/{employeeId} -H "Content-Type: application/pdf" -F "file=@/path/to/local/file.pdf"

сохранит содержимое /path/to/local/file.pdf в базе данных и свяжет его с сущностью сотрудника, чей идентификатор employeeId.

curl /employees/{employeeId} -H "Accept: application/pdf"

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

Поскольку вы связываете контент со своим сотрудником, когда вы получаете ваш json ответы от конечных точек Spring Data, они предоставят связанные с контентом метаданные, но НЕ «ужасные данные», которые вы видите с вашим текущим подходом.

Есть пара руководств по началу работы и видео здесь . Справочное руководство - здесь .

HTH

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