Files
InventoryTraker-Box/InventoryTraker.Web/Controllers/ImportController.cs
T
2016-10-18 11:10:01 -04:00

103 lines
3.1 KiB
C#

using System;
using System.Collections.Generic;
using System.Data.Entity.Infrastructure;
using System.Data.SqlClient;
using System.IO;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
using System.Web;
using System.Web.Http;
using InventoryTraker.Web.Core;
using InventoryTraker.Web.Data;
using InventoryTraker.Web.Services;
using InventoryTraker.Web.Utilities;
using NLog;
namespace InventoryTraker.Web.Controllers
{
public class ImportController : ApiController
{
private readonly AppDbContext _context;
private readonly InventoryImporter _inventoryImporter;
public ImportController(AppDbContext context, InventoryImporter inventoryImporter)
{
_context = context;
_inventoryImporter = inventoryImporter;
}
[HttpPost]
public async Task<HttpResponseMessage> Upload()
{
if (!Request.Content.IsMimeMultipartContent())
return Request.CreateResponse(HttpStatusCode.UnsupportedMediaType);
var provider = GetMultipartProvider();
var result = await Request.Content.ReadAsMultipartAsync(provider);
// uploadedFileInfo object will give you some additional stuff like file length,
// creation time, directory name, a few filesystem methods etc..
var uploadedFileInfo = new FileInfo(result.FileData.First().LocalFileName);
IEnumerable<Inventory> inventories;
try
{
inventories = _inventoryImporter.Import(uploadedFileInfo);
}
catch (ImportException e)
{
LogManager.GetCurrentClassLogger().Info("Import Exception : {0}", e.Message);
return Request.CreateResponse(HttpStatusCode.BadRequest, e.Messages);
}
foreach (var inventory in inventories)
{
_context.Inventories.Add(inventory);
inventory.Transactions = ModelHelper.GetAddedTransaction(inventory.AddedDate);
}
try
{
_context.SaveChanges();
}
catch (Exception e)
{
var message = ModelHelper.GetUpdateExceptionMessage(e);
LogManager.GetCurrentClassLogger().Info("Import Exception : {0}", message);
return Request.CreateResponse(HttpStatusCode.BadRequest, message);
}
return Request.CreateResponse(HttpStatusCode.OK, new {});
}
private MultipartFormDataStreamProvider GetMultipartProvider()
{
var uploadFolder = "~/App_Data/Tmp/FileUploads";
var root = HttpContext.Current.Server.MapPath(uploadFolder);
Directory.CreateDirectory(root);
return new MultipartFormDataExentisionStreamProvider(root);
}
// http://stackoverflow.com/questions/16800820/asp-net-webapi-file-upload-using-guid-and-file-extension
private class MultipartFormDataExentisionStreamProvider
: MultipartFormDataStreamProvider
{
public MultipartFormDataExentisionStreamProvider(string rootPath) : base(rootPath)
{
}
public override string GetLocalFileName(HttpContentHeaders headers)
{
// override the filename which is stored by the provider (by default is bodypart_x)
var oldfileName = headers.ContentDisposition.FileName.Replace("\"", string.Empty);
var newFileName = Guid.NewGuid() + Path.GetExtension(oldfileName);
return newFileName;
}
}
}
}