using Blahblah.FlowerStory.Server.Data;
using Microsoft.AspNetCore.Mvc;
using System.ComponentModel.DataAnnotations;
using System.Net;
namespace Blahblah.FlowerStory.Server.Controller;
///
/// 图片相关服务
///
[Produces("image/png")]
[Route("photo")]
public class ImageController : BaseController
{
///
public ImageController(FlowerDatabase database, ILogger? logger = null) : base(database, logger)
{
}
///
/// 请求用户头像
///
///
/// 请求示例:
///
/// GET /photo/avatar
/// Authorization: authorization id
///
///
/// 认证通过则显示用户头像
/// 返回头像
/// 认证失败
/// 未找到头像
[Route("avatar", Name = "getAvatar")]
[ProducesResponseType(StatusCodes.Status200OK)]
[ProducesResponseType(StatusCodes.Status401Unauthorized)]
[ProducesResponseType(StatusCodes.Status404NotFound)]
[HttpGet]
public ActionResult GetUserAvatar()
{
var (result, token) = CheckToken();
if (result != null)
{
return result;
}
if (token == null)
{
return Unauthorized();
}
var avatar = QueryUserAvatar(token.UserId);
if (avatar == null)
{
return NotFound();
}
return File(avatar, "image/png");
}
///
/// 请求花草照片
///
///
/// 请求示例:
///
/// GET /photo/flower/{fid}/{name}
///
///
/// 花草唯一 id
/// 照片名称
/// 认证通过则显示花草照片
/// 返回花草照片
/// 认证失败
/// 未找到花草照片
[Route("flower/{fid}/{name}", Name = "getFlowerPhoto")]
[ProducesResponseType(StatusCodes.Status200OK)]
[ProducesResponseType(StatusCodes.Status401Unauthorized)]
[ProducesResponseType(StatusCodes.Status404NotFound)]
[HttpGet]
public async Task GetFlowerPhoto([Required] int fid, [Required] string name)
{
//var (result, token) = CheckToken();
//if (result != null)
//{
// return result;
//}
//if (token == null)
//{
// return Unauthorized();
//}
#if !DEBUG
var referrer = Request.Headers.Referer.ToString();
if (string.IsNullOrEmpty(referrer))
{
return BadRequest();
}
if (!referrer.StartsWith(BaseUrl))
{
return Forbid();
}
#endif
var path = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "uploads", fid.ToString(), WebUtility.UrlEncode(name));
if (System.IO.File.Exists(path))
{
var data = await System.IO.File.ReadAllBytesAsync(path);
var ext = Path.GetExtension(path).ToLower();
return File(data, ext == ".png" ? "image/png" : "image/jpeg");
}
return NotFound();
}
}