Table of Contents
Założeniem projektu było stworzenie prostego nieblokującego Rest API do zapisu/odczytu dowolnych plików z wykorzystaniem przestrzeni dyskowej. Projekt bazuje na JDK 17 LTS i Spring Boot 2.6.1.
- Webflux
- Project reactor
- Spring Data R2dbc
- H2database
- Lombok
Encja File
@Table
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@Getter
@EqualsAndHashCode(doNotUseGetters = true)
public class File implements Persistable<String> {
@Id
# Poza wykorzytaniem jako primary key służy rownież jako nazwa pliku w przestrzeni dyskowej.
private String id;
# Oryginalna nazwa zaimportowanego pliku.
private String originalFileName;
# Typ MIME odczytany na podstawie oryginalnej nazwy pliku.
# Użyty do sprecyzowania "Content type" w nagłówku podczas pobrania pliku.
private String mediaType;
@CreatedDate
@Getter(AccessLevel.NONE)
@EqualsAndHashCode.Exclude
# Utworzona data i czas zapisania encji dzięki Spring Data Auditing
private LocalDateTime createdDate;
@Builder
public File(String originalFileName, MediaType mediaType) {
# Generowanie ID pliku
this.id = FileUuidGenerator.generate();
this.originalFileName = originalFileName;
this.mediaType = mediaType.getType() + "/" + mediaType.getSubtype();
}
@Override
@JsonIgnore
# Nadpisanie metody interfejsu Persistable, dzięki której Spring Data rozponaje encję jako nową.
# Powodem nadpisania jest fakt iż ID encji jest generowane przed utrwaleniem jej w bazie danych.
public boolean isNew() {
return Objects.isNull(createdDate);
}
# Mapowanie pola createdDate typu LocalDateTime na ZonedDateTime z domyślną strefą czasową aplikacji
public ZonedDateTime getCreatedDate() {
return Objects.nonNull(createdDate) ? createdDate.atZone(ZoneId.systemDefault()) : null;
}
}
Zawartość pliku jest zapisana w przestrzeni dyskowej w katalogu zdefiniowanym w application.properties
GET /api/files - lista wszystkich dostepnych plikówGET /api/files/{id} - pobranie zawartości pliku
POST /api/files - import pliku (z wykorzystaniem FormData)
DELETE /api/files/{id} - usunięcie pliku
Przykładowy POST response
{
"id": "1639931394448_05527ff6e12840648f45eacee866f114", # id pliku
"originalFileName": "dr2.PNG", # oryginalna nazwa pliku
"mediaType": "image/png", # typ MIME
"createdDate": "2021-12-19T17:29:54.4991365+01:00" # data i czas importu
}
Distributed under the MIT License. See LICENSE.txt
for more information.