Browse Source

files uploader

master
gsd 1 month ago
parent
commit
e9259f9a76
  1. 85
      src/main/java/app/controllers/FileController.java
  2. 39
      src/main/java/app/entities/db/DbFile.java
  3. 15
      src/main/java/app/repositories/FilePSRepository.java
  4. 9
      src/main/java/app/repositories/FileRepository.java
  5. 4
      src/main/resources/application.yaml

85
src/main/java/app/controllers/FileController.java

@ -0,0 +1,85 @@
package app.controllers;
import app.annotations.enums.CollectStages;
import app.annotations.interfaces.*;
import app.entities.SearchFilter;
import app.entities.db.DbFile;
import app.repositories.FilePSRepository;
import app.repositories.FileRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.io.InputStreamResource;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.sql.Timestamp;
import java.time.Instant;
import java.util.UUID;
@RestController
@RequestMapping("api/files")
public class FileController {
@Autowired
private FileRepository fileRepository;
@Autowired
private FilePSRepository filePSRepository;
@PostMapping
@CheckWebAccess
@CheckPermitionFlag(flag = "z")
@CollectStatistic(stage = CollectStages.COMBINED)
public ResponseEntity upload(@CookieValue(value = "steam64") String steam64,
@RequestParam("file") MultipartFile multipartFile) throws IOException {
if (multipartFile.isEmpty() || multipartFile.getSize() == 0L) return ResponseEntity.noContent().build();
UUID uuid = UUID.randomUUID();
Timestamp timestamp = Timestamp.from(Instant.now());
DbFile dbFile = new DbFile();
dbFile.setUploader(steam64);
dbFile.setFilename(multipartFile.getOriginalFilename());
dbFile.setFilesize(multipartFile.getSize());
dbFile.setData(multipartFile.getBytes());
dbFile.setTimestamp(timestamp);
dbFile.setId(uuid);
fileRepository.save(dbFile);
return ResponseEntity.ok(uuid.toString());
}
@GetMapping("/{uuid}")
public ResponseEntity<InputStreamResource> download(@PathVariable String uuid) throws UnsupportedEncodingException {
DbFile dbFile = fileRepository.findById(UUID.fromString(uuid)).orElse(null);
if (dbFile == null) return ResponseEntity.notFound().build();
HttpHeaders headers = new HttpHeaders();
headers.add(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=" + encodeFileName(dbFile.getFilename()));
return ResponseEntity.ok()
.headers(headers)
.contentLength(dbFile.getFilesize())
.contentType(MediaType.APPLICATION_OCTET_STREAM)
.body(new InputStreamResource(new ByteArrayInputStream(dbFile.getData())));
}
@PostMapping("/search")
@CheckWebAccess
@CheckPermitionFlag(flag = "z")
@CollectStatistic(stage = CollectStages.COMBINED)
public Page<DbFile> getFiles(Pageable pageable, @RequestBody(required = false) SearchFilter searchFilter) {
return filePSRepository.getFiles(pageable);
}
private static String encodeFileName(String fileName) throws UnsupportedEncodingException {
return URLEncoder.encode(fileName, StandardCharsets.UTF_8).replace("+", "%20");
}
}

39
src/main/java/app/entities/db/DbFile.java

@ -0,0 +1,39 @@
package app.entities.db;
import com.fasterxml.jackson.annotation.JsonIgnore;
import jakarta.persistence.*;
import lombok.Data;
import java.sql.Timestamp;
import java.util.UUID;
@Entity
@Table(schema = "tf2_facti13", name = "files")
@Data
public class DbFile {
@Id
@Column(name = "id")
private UUID id;
@Column(name = "uploader")
private String uploader;
@Column(name = "filename", length = 255)
private String filename;
@Column(name = "filesize")
private Long filesize;
@Column(name = "extrainfo")
private String extraInfo;
@Column(name = "data", columnDefinition = "bytea")
@JsonIgnore
private byte[] data;
@Column(name = "ts")
private Timestamp timestamp;
@Column(name = "deleted")
private Boolean deleted;
}

15
src/main/java/app/repositories/FilePSRepository.java

@ -0,0 +1,15 @@
package app.repositories;
import app.entities.db.DbFile;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.PagingAndSortingRepository;
import java.util.UUID;
public interface FilePSRepository extends PagingAndSortingRepository<DbFile, UUID> {
@Query("select f from DbFile f where f.deleted = false")
Page<DbFile> getFiles(Pageable pageable);
}

9
src/main/java/app/repositories/FileRepository.java

@ -0,0 +1,9 @@
package app.repositories;
import app.entities.db.DbFile;
import org.springframework.data.repository.CrudRepository;
import java.util.UUID;
public interface FileRepository extends CrudRepository<DbFile, UUID> {
}

4
src/main/resources/application.yaml

@ -18,6 +18,10 @@ spring:
properties:
hibernate:
format_sql: ${SHOW_SQL:false}
servlet:
multipart:
max-file-size: 10MB
max-request-size: 10MB
org:
jobrunr:

Loading…
Cancel
Save