From 72c655026d4d5f9be29910c03b034d25da13d9bb Mon Sep 17 00:00:00 2001 From: f7q Date: Wed, 12 Jul 2017 00:24:46 +0900 Subject: [PATCH 1/2] Add Upload Sample API --- .../Controllers/FilesController.cs | 12 +- .../Controllers/UploadController.cs | 114 ++++++++++++++++++ .../FileUploadOperation.cs | 3 +- .../Models/SQLServerDbContext.cs | 3 + .../Models/SQLiteDbContext.cs | 4 + .../WebApiFileUploadSample/Models/Value.cs | 6 + .../src/WebApiFileUploadSample/db.sqlite | Bin 57344 -> 61440 bytes 7 files changed, 136 insertions(+), 6 deletions(-) create mode 100644 WebApiFileUploadSample/src/WebApiFileUploadSample/Controllers/UploadController.cs diff --git a/WebApiFileUploadSample/src/WebApiFileUploadSample/Controllers/FilesController.cs b/WebApiFileUploadSample/src/WebApiFileUploadSample/Controllers/FilesController.cs index 557dffe..d80186f 100644 --- a/WebApiFileUploadSample/src/WebApiFileUploadSample/Controllers/FilesController.cs +++ b/WebApiFileUploadSample/src/WebApiFileUploadSample/Controllers/FilesController.cs @@ -5,13 +5,14 @@ using System.Threading.Tasks; using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Http; -using WebApiFileUploadSample.Models; using Microsoft.EntityFrameworkCore; // For more information on enabling Web API for empty projects, visit https://go.microsoft.com/fwlink/?LinkID=397860 namespace WebApiFileUploadSample.Controllers { + using WebApiFileUploadSample.Models; + [Route("api/[controller]")] public class FilesController : Controller { @@ -20,8 +21,9 @@ public FilesController(SQLiteDbContext dbContext) { _dbContext = dbContext; } + // GET: api/values - [HttpGet] + [HttpGet("Image")] public IActionResult Get() { try { @@ -35,7 +37,7 @@ public IActionResult Get() } // GET api/values/5 - [HttpGet("api/Image/{name}")] + [HttpGet("Image/{name}")] public IActionResult Get(string name) { try @@ -77,7 +79,7 @@ public async Task PostFile(IFormFile uploadedFile) } // DELETE api/values/5 - [HttpDelete("api/Image/{id}")] + [HttpDelete("imageid/{id}")] public IActionResult Delete(int id) { try @@ -93,7 +95,7 @@ public IActionResult Delete(int id) } } // GET api/values/5 - [HttpDelete("api/Image/{name}")] + [HttpDelete("imagename/{name}")] public IActionResult Delete(string name) { try diff --git a/WebApiFileUploadSample/src/WebApiFileUploadSample/Controllers/UploadController.cs b/WebApiFileUploadSample/src/WebApiFileUploadSample/Controllers/UploadController.cs new file mode 100644 index 0000000..9f4353c --- /dev/null +++ b/WebApiFileUploadSample/src/WebApiFileUploadSample/Controllers/UploadController.cs @@ -0,0 +1,114 @@ +using System; +using System.Text; +using System.IO; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Mvc; +using Microsoft.AspNetCore.Http; +using Microsoft.EntityFrameworkCore; + +namespace WebApiFileUploadSample.Controllers +{ + using WebApiFileUploadSample.Models; + + [Route("api/[controller]")] + public class UploadController : Controller + { + private readonly SQLiteDbContext _dbContext; + public UploadController(SQLiteDbContext dbContext) + { + _dbContext = dbContext; + } + // GET: api/values + [HttpGet("text")] + public IActionResult Get() + { + try + { + var list = _dbContext.Files.ToList(); + return Ok(list); + } + catch (Exception ex) + { + return NotFound(); + } + } + + // GET api/values/5 + [HttpGet("text/{name}")] + [Produces("text/xml")] + public IActionResult Get(string name) + { + try + { + var val = _dbContext.Files.FirstOrDefault(d => d.Name == name); + return Ok(new MemoryStream(Encoding.UTF8.GetBytes(val.Text))); //File(val.Text, "text/xml"); + } + catch (Exception ex) + { + return NotFound(); + } + } + + // POST api/values + [HttpPost] + [Route("upload")] + public async Task PostFile(IFormFile uploadedFile) + { + try + { + using (var memoryStream = new MemoryStream()) + { + var val = new File(); + val.Name = uploadedFile.FileName; + await uploadedFile.CopyToAsync(memoryStream); + val.Text = Encoding.UTF8.GetString(memoryStream.ToArray()); + _dbContext.Files.Add(val); + _dbContext.SaveChanges(); + } + // process uploaded files + // Don't rely on or trust the FileName property without validation. + + return Ok(); + } + catch (Exception ex) + { + return BadRequest(); + } + } + + // DELETE api/values/5 + [HttpDelete("textid/{id}")] + public IActionResult Delete(int id) + { + try + { + var val = _dbContext.Files.FirstOrDefault(d => d.Id == id); + _dbContext.Remove(val); + _dbContext.SaveChanges(); + return Ok(); + } + catch (Exception ex) + { + return NotFound(); + } + } + // GET api/values/5 + [HttpDelete("filename/{name}")] + public IActionResult Delete(string name) + { + try + { + var val = _dbContext.Files.FirstOrDefault(d => d.Name == name); + _dbContext.Remove(val); + _dbContext.SaveChanges(); + return Ok(); + } + catch (Exception ex) + { + return NotFound(); + } + } + } +} diff --git a/WebApiFileUploadSample/src/WebApiFileUploadSample/FileUploadOperation.cs b/WebApiFileUploadSample/src/WebApiFileUploadSample/FileUploadOperation.cs index 6f87d02..b7f1bb0 100644 --- a/WebApiFileUploadSample/src/WebApiFileUploadSample/FileUploadOperation.cs +++ b/WebApiFileUploadSample/src/WebApiFileUploadSample/FileUploadOperation.cs @@ -13,7 +13,8 @@ public class FileUploadOperation : IOperationFilter public void Apply(Operation operation, OperationFilterContext context) { if (operation.OperationId.ToLower() == "apivaluesuploadpost" || - operation.OperationId.ToLower() == "apifilesuploadpost") + operation.OperationId.ToLower() == "apifilesuploadpost" || + operation.OperationId.ToLower() == "apiuploaduploadpost") { operation.Parameters.Clear(); operation.Parameters.Add(new NonBodyParameter diff --git a/WebApiFileUploadSample/src/WebApiFileUploadSample/Models/SQLServerDbContext.cs b/WebApiFileUploadSample/src/WebApiFileUploadSample/Models/SQLServerDbContext.cs index e1c9cfb..4add66c 100644 --- a/WebApiFileUploadSample/src/WebApiFileUploadSample/Models/SQLServerDbContext.cs +++ b/WebApiFileUploadSample/src/WebApiFileUploadSample/Models/SQLServerDbContext.cs @@ -34,10 +34,13 @@ protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) public DbSet Values { get; set; } + public DbSet Files { get; set; } + protected override void OnModelCreating(ModelBuilder builder) { //builder.Entity().ToTable("Values"); builder.Entity().HasKey(m => m.Id); // この場合、自動採番がデフォルトで、ID無しで登録になる。 + builder.Entity().HasKey(m => m.Id); // この場合、自動採番がデフォルトで、ID無しで登録になる。 base.OnModelCreating(builder); } } diff --git a/WebApiFileUploadSample/src/WebApiFileUploadSample/Models/SQLiteDbContext.cs b/WebApiFileUploadSample/src/WebApiFileUploadSample/Models/SQLiteDbContext.cs index 59fffbc..a14c3dd 100644 --- a/WebApiFileUploadSample/src/WebApiFileUploadSample/Models/SQLiteDbContext.cs +++ b/WebApiFileUploadSample/src/WebApiFileUploadSample/Models/SQLiteDbContext.cs @@ -36,9 +36,13 @@ protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) public DbSet Values { get; set; } + public DbSet Files { get; set; } + protected override void OnModelCreating(ModelBuilder builder) { builder.Entity().HasKey(m => m.Id); + builder.Entity().HasKey(m => m.Id); // この場合、自動採番がデフォルトで、ID無しで登録になる。 + base.OnModelCreating(builder); } } diff --git a/WebApiFileUploadSample/src/WebApiFileUploadSample/Models/Value.cs b/WebApiFileUploadSample/src/WebApiFileUploadSample/Models/Value.cs index e24db0d..09e864e 100644 --- a/WebApiFileUploadSample/src/WebApiFileUploadSample/Models/Value.cs +++ b/WebApiFileUploadSample/src/WebApiFileUploadSample/Models/Value.cs @@ -11,4 +11,10 @@ public class Value public string Name { get; set; } public byte[] Image { get; set; } } + public class File + { + public int Id { get; set; } + public string Name { get; set; } + public string Text { get; set; } + } } diff --git a/WebApiFileUploadSample/src/WebApiFileUploadSample/db.sqlite b/WebApiFileUploadSample/src/WebApiFileUploadSample/db.sqlite index 9cfc983a3f14b507839f41c7528fd3bca1fa19dc..69991ed43b37b8a004abf45c9e7b677f6d6f1549 100644 GIT binary patch delta 1005 zcmZoTz})bFd4jYc4+8@OKM=zJ*F+s-aUKTUpB=n>b_}e%c?^7)_}B8j;q&Ls+bk&X zmV0wD4>zMu4LiHIxHw~Dcu8VXPO4jGPHHij;CBvkbqsM;2yt}saaBkFi%tH(BQtq6 zpB7h0YDGx`XNYS=$mCbNu^epdY+zeA`}1uzI1788p1E8`iJoU}I%&ZKuZM=>J1$q^UxjFB5@3#T6b25_? zOEUBG6e_Hoa}tY-ZI!|c(vZXr^?)2DUM>Y>P?4LH2UM9+Qc_^0uV0*;k(!%Wte2aa zT$Ep&pH`xmoS&;-o|%_cp>JehV5SeUu3o>OD782>uLNuxRs*dnNHY?5YdB~IuWC2H`L Kj))U1Q33!8doSt$ delta 116 zcmZp8z}#?vd4jYc3j+fK9}vR;=R_T2aTW&MpB=n>b_^`MZy5M4@vr55!{^V-vsqB! zE%)YR9&X0TM|s>Q&*n3q{DwE01FW@?nRT;2-&R8oM*go1{9pM`0~PP*pM2V1esT{F K_vWwu+!FvD{U1L7 From 17abf8ff2ca36ae537806e95e317ba24db4abfe6 Mon Sep 17 00:00:00 2001 From: f7Q Date: Fri, 28 Jul 2017 01:28:30 +0900 Subject: [PATCH 2/2] Add Detail --- .../Controllers/UploadController.cs | 32 ++++++++++++++++--- .../FileUploadOperation.cs | 20 ++++++++++-- .../src/WebApiFileUploadSample/Startup.cs | 4 +-- 3 files changed, 47 insertions(+), 9 deletions(-) diff --git a/WebApiFileUploadSample/src/WebApiFileUploadSample/Controllers/UploadController.cs b/WebApiFileUploadSample/src/WebApiFileUploadSample/Controllers/UploadController.cs index 9f4353c..e142817 100644 --- a/WebApiFileUploadSample/src/WebApiFileUploadSample/Controllers/UploadController.cs +++ b/WebApiFileUploadSample/src/WebApiFileUploadSample/Controllers/UploadController.cs @@ -7,6 +7,7 @@ using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Http; using Microsoft.EntityFrameworkCore; +using Microsoft.Extensions.Logging; namespace WebApiFileUploadSample.Controllers { @@ -15,9 +16,11 @@ namespace WebApiFileUploadSample.Controllers [Route("api/[controller]")] public class UploadController : Controller { + private readonly ILogger logger; private readonly SQLiteDbContext _dbContext; - public UploadController(SQLiteDbContext dbContext) + public UploadController(SQLiteDbContext dbContext, ILogger logger) { + this.logger = logger; _dbContext = dbContext; } // GET: api/values @@ -26,16 +29,31 @@ public IActionResult Get() { try { - var list = _dbContext.Files.ToList(); + var list = _dbContext.Files.Select(x => new { Name = x.Name }).ToList(); return Ok(list); } catch (Exception ex) { + this.logger.LogWarning("", ex); + return NotFound(); + } + } + [HttpGet("download/{name}")] + public IActionResult GetDownload(string name) + { + try + { + var val = _dbContext.Files.FirstOrDefault(d => d.Name == name); + Response.ContentType = "application/octet-stream"; + return Ok(new MemoryStream(Encoding.UTF8.GetBytes(val.Text))); //File(val.Text, "text/xml"); + } + catch (Exception ex) + { + this.logger.LogWarning("", ex); return NotFound(); } } - // GET api/values/5 [HttpGet("text/{name}")] [Produces("text/xml")] public IActionResult Get(string name) @@ -47,14 +65,15 @@ public IActionResult Get(string name) } catch (Exception ex) { + this.logger.LogWarning("", ex); return NotFound(); } } // POST api/values [HttpPost] - [Route("upload")] - public async Task PostFile(IFormFile uploadedFile) + [Route("upload/{id}/")] + public async Task PostFile([FromRoute]short id, IFormFile uploadedFile) { try { @@ -74,6 +93,7 @@ public async Task PostFile(IFormFile uploadedFile) } catch (Exception ex) { + this.logger.LogWarning("", ex); return BadRequest(); } } @@ -91,6 +111,7 @@ public IActionResult Delete(int id) } catch (Exception ex) { + this.logger.LogWarning("", ex); return NotFound(); } } @@ -107,6 +128,7 @@ public IActionResult Delete(string name) } catch (Exception ex) { + this.logger.LogWarning("", ex); return NotFound(); } } diff --git a/WebApiFileUploadSample/src/WebApiFileUploadSample/FileUploadOperation.cs b/WebApiFileUploadSample/src/WebApiFileUploadSample/FileUploadOperation.cs index b7f1bb0..41d029d 100644 --- a/WebApiFileUploadSample/src/WebApiFileUploadSample/FileUploadOperation.cs +++ b/WebApiFileUploadSample/src/WebApiFileUploadSample/FileUploadOperation.cs @@ -13,8 +13,7 @@ public class FileUploadOperation : IOperationFilter public void Apply(Operation operation, OperationFilterContext context) { if (operation.OperationId.ToLower() == "apivaluesuploadpost" || - operation.OperationId.ToLower() == "apifilesuploadpost" || - operation.OperationId.ToLower() == "apiuploaduploadpost") + operation.OperationId.ToLower() == "apifilesuploadpost") { operation.Parameters.Clear(); operation.Parameters.Add(new NonBodyParameter @@ -27,6 +26,23 @@ public void Apply(Operation operation, OperationFilterContext context) }); operation.Consumes.Add("multipart/form-data"); } + + // オペレーションIDはSwaggerから調べるBy{id} + if (operation.OperationId.ToLower() == "apiuploaduploadbyidpost") + { + var param = operation.Parameters[0]; // パラメータ取得By{id}部分 + operation.Parameters.Clear(); + operation.Parameters.Add(param); + operation.Parameters.Add(new NonBodyParameter + { + Name = "uploadedFile", + In = "formData", + Description = "Upload File", + Required = true, + Type = "file" + }); + operation.Consumes.Add("multipart/form-data"); + } } } diff --git a/WebApiFileUploadSample/src/WebApiFileUploadSample/Startup.cs b/WebApiFileUploadSample/src/WebApiFileUploadSample/Startup.cs index c461b39..c25e173 100644 --- a/WebApiFileUploadSample/src/WebApiFileUploadSample/Startup.cs +++ b/WebApiFileUploadSample/src/WebApiFileUploadSample/Startup.cs @@ -49,8 +49,8 @@ public void ConfigureServices(IServiceCollection services) options.SingleApiVersion(new Info { Version = "v1", - Title = "Geo Search API", - Description = "A simple api to search using geo location in Elasticsearch", + Title = "File Store API", + Description = "A simple api to File Access", TermsOfService = "None" }); //options.IncludeXmlComments(pathToDoc);