Files
rockfish/Controllers/RfCaseBlobController.cs
2018-06-28 23:37:38 +00:00

220 lines
6.5 KiB
C#

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Authorization;
using Microsoft.EntityFrameworkCore;
using rockfishCore.Models;
namespace rockfishCore.Controllers
{
[Produces("application/json")]
[Route("api/RfCaseBlob")]
public class RfCaseBlobController : Controller
{
private readonly rockfishContext _context;
public RfCaseBlobController(rockfishContext context)
{
_context = context;
}
// GET: api/RfCaseBlob
[HttpGet]
[Authorize]
public IEnumerable<RfCaseBlob> GetRfCaseBlob()
{
var c = from s in _context.RfCaseBlob select s;
c = c.OrderBy(s => s.Name);
return c;
}
[HttpPost("upload")]
public IActionResult UploadFilesAjax([FromQuery] string rfcaseid)
{//http://www.binaryintellect.net/articles/f1cee257-378a-42c1-9f2f-075a3aed1d98.aspx
//need a proper case ID to do this
if (string.IsNullOrWhiteSpace(rfcaseid) || rfcaseid == "new")
{
return BadRequest();
}
var files = Request.Form.Files;
int nCount=0;
foreach (var file in files)
{
if (file.Length > 0)
{
using (var fileStream = file.OpenReadStream())
using (var ms = new System.IO.MemoryStream())
{
fileStream.CopyTo(ms);
var fileBytes = ms.ToArray();
RfCaseBlob blob=new RfCaseBlob();
blob.RfCaseId=Convert.ToInt64(rfcaseid);
blob.Name=file.FileName;
blob.File=fileBytes;
_context.RfCaseBlob.Add(blob);
_context.SaveChanges();
nCount++;
}
}
}
string message = $"{nCount} file(s) uploaded successfully!";
return Json(message);
}
[HttpGet("download/{id}")]
public ActionResult Download([FromRoute] long id, [FromQuery] string dlkey)
{//https://dotnetcoretutorials.com/2017/03/12/uploading-files-asp-net-core/
//https://stackoverflow.com/questions/45763149/asp-net-core-jwt-in-uri-query-parameter/45811270#45811270
if (string.IsNullOrWhiteSpace(dlkey))
{
return NotFound();
}
//get user by key, if not found then reject
//If user dlkeyexp has not expired then return file
var user = _context.User.SingleOrDefault(m => m.DlKey == dlkey);
if (user == null)
{
return NotFound();
}
var unixdtnow = new DateTimeOffset(DateTime.Now).ToUnixTimeSeconds();
if (user.DlKeyExp < unixdtnow)
{
return NotFound();
}
//Ok, user has a valid download key and it's not expired yet so get the file
var f = _context.RfCaseBlob.SingleOrDefault(m => m.Id == id);
if (f == null)
{
return NotFound();
}
var extension = System.IO.Path.GetExtension(f.Name);
string mimetype = "application/x-msdownload";
if (!string.IsNullOrWhiteSpace(extension))
{
mimetype = Util.MimeTypeMap.GetMimeType(extension);
}
Response.Headers.Add("Content-Disposition", "inline; filename=" + f.Name);
return File(f.File, mimetype);//NOTE: if you don't specify a filename here then the above content disposition header takes effect, if you do then the 'File(' method sets it as attachment automatically
}
// GET: api/RfCaseBlob/5
[HttpGet("{id}")]
[Authorize]
public async Task<IActionResult> GetRfCaseBlob([FromRoute] long id)
{
if (!ModelState.IsValid)
{
return BadRequest(ModelState);
}
var RfCaseBlob = await _context.RfCaseBlob.SingleOrDefaultAsync(m => m.Id == id);
if (RfCaseBlob == null)
{
return NotFound();
}
return Ok(RfCaseBlob);
}
// PUT: api/RfCaseBlob/5
[HttpPut("{id}")]
[Authorize]
public async Task<IActionResult> PutRfCaseBlob([FromRoute] long id, [FromBody] RfCaseBlob RfCaseBlob)
{
if (!ModelState.IsValid)
{
return BadRequest(ModelState);
}
if (id != RfCaseBlob.Id)
{
return BadRequest();
}
_context.Entry(RfCaseBlob).State = EntityState.Modified;
try
{
await _context.SaveChangesAsync();
}
catch (DbUpdateConcurrencyException)
{
if (!RfCaseBlobExists(id))
{
return NotFound();
}
else
{
throw;
}
}
return NoContent();
}
// POST: api/RfCaseBlob
[HttpPost]
[Authorize]
public async Task<IActionResult> PostRfCaseBlob([FromBody] RfCaseBlob RfCaseBlob)
{
if (!ModelState.IsValid)
{
return BadRequest(ModelState);
}
_context.RfCaseBlob.Add(RfCaseBlob);
await _context.SaveChangesAsync();
return CreatedAtAction("GetRfCaseBlob", new { id = RfCaseBlob.Id }, RfCaseBlob);
}
// DELETE: api/RfCaseBlob/5
[HttpDelete("{id}")]
[Authorize]
public async Task<IActionResult> DeleteRfCaseBlob([FromRoute] long id)
{
if (!ModelState.IsValid)
{
return BadRequest(ModelState);
}
var RfCaseBlob = await _context.RfCaseBlob.SingleOrDefaultAsync(m => m.Id == id);
if (RfCaseBlob == null)
{
return NotFound();
}
_context.RfCaseBlob.Remove(RfCaseBlob);
await _context.SaveChangesAsync();
return Ok(RfCaseBlob);
}
private bool RfCaseBlobExists(long id)
{
return _context.RfCaseBlob.Any(e => e.Id == id);
}
}
}