Files
excel-download/bulkupload/src/main/java/com/example/bulkupload/controller/TusUploadController.java
2022-12-29 16:18:33 +09:00

77 lines
2.9 KiB
Java

package com.example.bulkupload.controller;
import com.example.bulkupload.service.FileUploadService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.core.io.FileSystemResource;
import org.springframework.core.io.Resource;
import org.springframework.core.io.support.ResourceRegion;
import org.springframework.http.*;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.concurrent.TimeUnit;
@Slf4j
@RestController
@RequiredArgsConstructor
@RequestMapping("/api")
public class TusUploadController {
private final FileUploadService fileUploadService;
@Value("${video.path}")
private String savedPath;
@CrossOrigin(origins = "*")
@RequestMapping(value = {"/upload", "/upload/**"})
public ResponseEntity<String> uploadWithTus2(HttpServletRequest request, HttpServletResponse response) {
String filename = fileUploadService.process(request, response);
return httpOkStatus(filename);
}
private static ResponseEntity<String> httpOkStatus(String filename) {
HttpHeaders headers = new HttpHeaders();
headers.set(HttpHeaders.ACCESS_CONTROL_EXPOSE_HEADERS, "*");
return ResponseEntity.status(HttpStatus.OK)
.headers(headers)
.body(filename);
}
@GetMapping("/video/{date}/{url}")
public ResponseEntity<ResourceRegion> videoResource(@RequestHeader HttpHeaders headers,
@PathVariable String date,
@PathVariable String url) throws IOException {
String path = savedPath + "/" + date + "/" + url;
Resource resource = new FileSystemResource(path);
long chunkSize = 1024 * 1024;
long contentLength = resource.contentLength();
ResourceRegion region;
try {
HttpRange httpRange = headers.getRange().stream().findFirst().get();
long start = httpRange.getRangeStart(contentLength);
long end = httpRange.getRangeEnd(contentLength);
long rangeLength = Long.min(chunkSize, end -start + 1);
region = new ResourceRegion(resource, start, rangeLength);
} catch (Exception e) {
long rangeLength = Long.min(chunkSize, contentLength);
region = new ResourceRegion(resource, 0, rangeLength);
}
return ResponseEntity.status(HttpStatus.PARTIAL_CONTENT)
.cacheControl(CacheControl.maxAge(10, TimeUnit.MINUTES))
.contentType(MediaTypeFactory.getMediaType(resource).orElse(MediaType.APPLICATION_OCTET_STREAM))
.header("Accept-Ranges", "bytes")
.eTag(path)
.body(region);
}
}