1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
|
using HyperBooru.Services;
using HyperBooru.Util;
using Microsoft.AspNetCore.Mvc;
namespace HyperBooru.Controllers;
[ApiController]
[Route("/media")]
public class MediaController : Controller {
private IMediaService mediaService;
private IConfigService config;
private HBContext db;
public MediaController(
IMediaService mediaService,
IConfigService config,
HBContext db) {
this.mediaService = mediaService;
this.config = config;
this.db = db;
}
[HttpGet("{mediaId}")]
public IActionResult Fetch([FromRoute] Guid mediaId) {
var media = db.Media.First(m => m.Guid == mediaId);
if(media is null)
return NotFound();
var fs = System.IO.File.OpenRead(mediaService.GetPath(media));
return new FileStreamResult(fs, media.MimeType);
}
[HttpGet("thumb/{mediaId}")]
public IActionResult Thumbnail(
[FromRoute] Guid mediaId,
[FromQuery(Name = "w")] int? width,
[FromQuery(Name = "h")] int? height) {
try {
var thumb = mediaService.GetThumbnail(mediaId, width, height);
return new FileStreamResult(thumb, "image/jpeg");
} catch(ThumbnailException e) {
return BadRequest(e.Message);
} catch(ObjectNotFoundException e) {
return NotFound(e.Message);
}
}
[HttpDelete("{mediaId}")]
public void Delete([FromRoute] Guid mediaId) {
mediaService.Delete(mediaId);
}
[HttpPost]
public IActionResult Upload() {
if(Request.Form.Files.Count == 0)
return BadRequest("No files");
Media media = new();
foreach(var formFile in Request.Form.Files) {
try {
// Parse timestamps from headers
DateTime? lastAccessTime =
formFile.Headers["X-HyperBooru-LastAccessTime"]
.ElementAtOrDefault(0)?
.TryParseDateTimeUtc();
DateTime? lastWriteTime =
formFile.Headers["X-HyperBooru-LastWriteTime"]
.ElementAtOrDefault(0)?
.TryParseDateTimeUtc();
DateTime? createTime =
formFile.Headers["X-HyperBooru-CreateTime"]
.ElementAtOrDefault(0)?
.TryParseDateTimeUtc();
media = mediaService.Create(
formFile.OpenReadStream(),
formFile.FileName,
formFile.Headers["X-HyperBooru-Checksum"]
.ElementAtOrDefault(0),
lastAccessTime,
lastWriteTime,
createTime);
} catch(MediaCreateException e) {
return BadRequest(e.Message);
}
}
if(Request.Form.Files.Count == 1)
return Redirect($"/ViewMedia?m={media.Guid}");
else
return Redirect($"/Gallery");
}
}
|