运行效果:1分钟临时共享空间 - 免注册即时文件文本共享工具 | 极速传
直接上代码:
using Microsoft.AspNetCore.Mvc;
using SaaS.OfficialWebSite.Web.Utils;
using ZXing.QrCode;
using ZXing;
using SkiaSharp;
using ZXing.SkiaSharp.Rendering;
using ZXing.Common;
using ZXing.QrCode.Internal;
namespace SaaS.OfficialWebSite.Web.Controllers
{
public class ShareSpaceController : Controller
{
public IActionResult Index()
{
if (string.IsNullOrEmpty(HttpContext.Session.GetString("CurrentUser")))
{
HttpContext.Session.SetString("CurrentUser", Guid.NewGuid().ToString("N"));
}
return View();
}
private readonly ISpaceService _spaceService;
public ShareSpaceController(ISpaceService spaceService)
{
_spaceService = spaceService;
}
[HttpGet("GenerateQrCode")]
public IActionResult GenerateQrCode([FromQuery] string content)
{
if (string.IsNullOrWhiteSpace(content))
{
return BadRequest("内容不能为空");
}
try
{
var qrCodeBytes = GenerateQrCodeImg(content);
return File(qrCodeBytes, "image/png");
}
catch (Exception ex)
{
return StatusCode(500, $"生成二维码失败: {ex.Message}");
}
}
public byte[] GenerateQrCodeImg(string content, int width = 300, int height = 300)
{
// 解析颜色
var foreground = SKColors.Black;
var background = SKColors.White;
// 创建渲染器
var renderer = new SKBitmapRenderer();
renderer.Foreground = foreground;
renderer.Background = background;
// 配置条形码写入器
var barcodeWriter = new BarcodeWriter<SKBitmap>
{
Format = BarcodeFormat.QR_CODE,
Options = new EncodingOptions
{
Width = width,
Height = height,
Margin = 2,
PureBarcode = true
},
Renderer = renderer // 使用配置好的渲染器
};
barcodeWriter.Options.Hints.Add(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.M);
// 生成条形码/二维码
var barcodeBitmap = barcodeWriter.Write(content);
// 将图像转换为内存流
using (var image = SKImage.FromBitmap(barcodeBitmap))
using (var data = image.Encode(SKEncodedImageFormat.Png, 100))
using (var memoryStream = new MemoryStream())
{
data.SaveTo(memoryStream);
memoryStream.Seek(0, SeekOrigin.Begin);
return memoryStream.ToArray();
}
}
[HttpGet("GetUserSpaces")]
public async Task<IActionResult> GetUserSpaces()
{
// 这里应该从认证中获取用户ID,示例使用固定值
var userId = HttpContext.Session.GetString("CurrentUser");
var spaces = await _spaceService.GetUserSpaces(userId);
return Ok(SpaceApiResponse<IEnumerable<Space>>.Ok(spaces));
}
[HttpGet("GetSpace")]
public async Task<IActionResult> GetSpace([FromQuery] string id)
{
var space = await _spaceService.GetSpace(id);
if (space == null)
{
return NotFound(SpaceApiResponse<Space>.Fail("空间不存在"));
}
// 检查用户是否有权限访问
var userId = HttpContext.Session.GetString("CurrentUser");
if (space.OwnerId != userId && !space.MemberIds.Contains(userId))
{
return Unauthorized(SpaceApiResponse<Space>.Fail("无权访问此空间"));
}
return Ok(SpaceApiResponse<Space>.Ok(space));
}
[HttpPost("CreateSpace")]
public async Task<IActionResult> CreateSpace([FromForm] CreateSpaceRequest request)
{
if (string.IsNullOrWhiteSpace(request.Name))
{
return BadRequest(SpaceApiResponse<Space>.Fail("空间名称不能为空"));
}
var userId = HttpContext.Session.GetString("CurrentUser");
var space = await _spaceService.CreateSpace(request.Name, userId);
return Ok(SpaceApiResponse<Space>.Ok(space));
}
[HttpDelete("DeleteSpace")]
public async Task<IActionResult> DeleteSpace([FromQuery] string id)
{
var space = await _spaceService.GetSpace(id);
if (space == null)
{
return NotFound(SpaceApiResponse<bool>.Fail("空间不存在"));
}
// 检查用户是否有权限删除
var userId = HttpContext.Session.GetString("CurrentUser");
if (space.OwnerId != userId)
{
return Unauthorized(SpaceApiResponse<bool>.Fail("无权删除此空间"));
}
var result = await _spaceService.DeleteSpace(id);
return Ok(SpaceApiResponse<bool>.Ok(result));
}
[HttpPost("JoinSpace")]
public async Task<IActionResult> JoinSpace([FromQuery] string id)
{
var space = await _spaceService.GetSpace(id);
if (space == null)
{
return Ok(SpaceApiResponse<bool>.Fail("空间不存在"));
}
var userId = HttpContext.Session.GetString("CurrentUser");
if (space.OwnerId == userId || space.MemberIds.Contains(userId))
{
return Ok(SpaceApiResponse<Space>.Ok(space));
}
var result = await _spaceService.AddUserToSpace(id, userId);
return Ok(SpaceApiResponse<Space>.Ok(space));
}
[HttpGet("GetSpaceItems")]
public async Task<IActionResult> GetSpaceItems([FromQuery] string id)
{
var space = await _spaceService.GetSpace(id);
if (space == null)
{
return NotFound(SpaceApiResponse<object>.Fail("空间不存在"));
}
// 检查用户是否有权限访问
var userId = HttpContext.Session.GetString("CurrentUser");
if (space.OwnerId != userId && !space.MemberIds.Contains(userId))
{
return Unauthorized(SpaceApiResponse<object>.Fail("无权访问此空间"));
}
var items = await _spaceService.GetSpaceItems(id);
return Ok(SpaceApiResponse<object>.Ok(new
{
name = space.Name,
items = items
}));
}
[HttpPost("AddTextItem")]
public async Task<IActionResult> AddTextItem([FromForm] AddTextItemRequest request)
{
if (string.IsNullOrWhiteSpace(request.Title) || string.IsNullOrWhiteSpace(request.Content))
{
return BadRequest(SpaceApiResponse<TextItem>.Fail("标题和内容不能为空"));
}
// 检查空间是否存在和权限
var space = await _spaceService.GetSpace(request.SpaceId);
if (space == null)
{
return NotFound(SpaceApiResponse<TextItem>.Fail("空间不存在"));
}
var userId = HttpContext.Session.GetString("CurrentUser");
if (space.OwnerId != userId && !space.MemberIds.Contains(userId))
{
return Unauthorized(SpaceApiResponse<TextItem>.Fail("无权在此空间添加内容"));
}
var textItem = await _spaceService.AddTextItem(
request.SpaceId,
request.Title,
request.Content,
userId);
return Ok(SpaceApiResponse<TextItem>.Ok(textItem));
}
[HttpPost("UploadFile")]
public async Task<IActionResult> UploadFile([FromForm] IFormFile file, [FromForm] string spaceId)
{
if (file == null || file.Length == 0)
{
return BadRequest(SpaceApiResponse<FileItem>.Fail("文件不能为空"));
}
// 检查空间是否存在和权限
var space = await _spaceService.GetSpace(spaceId);
if (space == null)
{
return NotFound(SpaceApiResponse<FileItem>.Fail("空间不存在"));
}
var userId = HttpContext.Session.GetString("CurrentUser");
if (space.OwnerId != userId && !space.MemberIds.Contains(userId))
{
return Unauthorized(SpaceApiResponse<FileItem>.Fail("无权在此空间上传文件"));
}
var fileItem = await _spaceService.AddFileItem(spaceId, file, userId);
return Ok(SpaceApiResponse<FileItem>.Ok(fileItem));
}
[HttpDelete("DeleteItem")]
public async Task<IActionResult> DeleteItem([FromQuery] string spaceId, [FromQuery] string type, [FromQuery] string id)
{
if (type != "text" && type != "file")
{
return BadRequest(SpaceApiResponse<bool>.Fail("无效的类型"));
}
var item = (await _spaceService.GetSpaceItems(spaceId))
.FirstOrDefault(i => i.Id == id && i.Type == type);
if (item == null)
{
return NotFound(SpaceApiResponse<bool>.Fail("内容不存在"));
}
// 检查权限
var userId = HttpContext.Session.GetString("CurrentUser");
if (item.CreatorId != userId)
{
// 如果是空间所有者也可以删除
var space = await _spaceService.GetSpace(item.SpaceId);
if (space?.OwnerId != userId)
{
return Unauthorized(SpaceApiResponse<bool>.Fail("无权删除此内容"));
}
}
var result = await _spaceService.DeleteItem(id, type);
return Ok(SpaceApiResponse<bool>.Ok(result));
}
}
// DTOs
public class CreateSpaceRequest
{
public string Name { get; set; }
}
public class AddTextItemRequest
{
public string SpaceId { get; set; }
public string Title { get; set; }
public string Content { get; set; }
}
}