ASP.NET WebAPI를 사용하여 ZIP 파일 업로드에서 추출한 각 파일을 임시 저장 또는 없이 수행하는 샘플
HTTP 압축 방법으로 전통적인 것은 JSON을 GZIP 해 주면 좋을 것입니다.
WEB어플리로 완결할 수 있는 경우는 그쪽이 좋다고 생각합니다.
그러나 사무계의 일 등에서는 CSV는 현역 발리의 포맷이기도 하고, 역사 있는 시스템에서도 자주(잘) 사용되고 있습니다.
이번에는 그런 CSV를 ZIP로하는 이야기입니다.
html (cshtml)
bootstrap을 사용하고 있습니다.
디폴트의 파일 선택 박스가 다사이므로 소세공이 하고 있습니다.
<form class="form-inline" id="myform">
<div class="form-group">
<div class="hidden">
<input id="file-input" type="file">
</div>
<input type="text" id="file-name" class="form-control" placeholder="select file..." readonly>
</div>
<div class="form-group">
<div class="btn-group">
<button type="button" id="browse" class="btn btn-info">Browse</button>
<button type="button" id="upload" class="btn btn-info">upload</button>
</div>
</div>
</form>
javascript
이쪽도 html에 맞춘 소세공이 하고 있습니다.
중요한 것은 $.ajax 당입니다 (뭐 흠 느낌인가).
$(function () {
$('#browse').on('click', function () {
$('#file-input').trigger('click');
});
$('#file-input').on('change', function () {
$('#file-name').val($(this).val());
});
$('#upload').on('click', function () {
upload();
});
});
var upload = function () {
var formData = new FormData();
$file = $('#file-input');
formData.append('file', $file[0].files[0]);// マルチでも送信できるがとりあえず1つ
$.ajax({
url: "http://localhost:54302/api/mytestapi",// この辺は環境に合わせて
type: "POST",
data: formData,
cache: false,
contentType: false,
processData: false,
})
.done(function (data, textStatus, jqXHR) {
alert(data);
})
.fail(function (jqXHR, textStatus, errorThrown) {
alert("fail");
});
};
C#(WebAPI Controller)
컨트롤러에 써야 할지는 제쳐두고.
이번은 샘플이므로 컨트롤러만.
(하지만 파일 형식 처리를 모델로 가져오는 것은 다르다고 생각합니다.)
이번에는 자신이 여러 CSV 파일을 ZIP하고 업로드하기 위해 CsvHelper를 사용하고 있습니다.
using CsvHelper;
using System;
using System.Collections.Generic;
using System.IO;
using System.IO.Compression;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Text;
using System.Web.Http;
namespace WebApplication1.Controllers
{
public class MyTestApiController : ApiController
{
// POST api/<controller>
public string Post(HttpRequestMessage request)
{
if (!request.Content.IsMimeMultipartContent())
return string.Empty;
var sb = new StringBuilder();
MultipartMemoryStreamProvider provider = request.Content.ReadAsMultipartAsync().Result;
foreach (var content in provider.Contents)
{
// 各Contentを処理
using (var ms = new MemoryStream(content.ReadAsByteArrayAsync().Result))
using (var za = new ZipArchive(ms))
{
foreach (var entry in za.Entries)
{
sb.AppendLine($"===== {entry.FullName} =====");
using (var sr = new StreamReader(entry.Open()))
using (var csvr = new CsvReader(sr))
{
csvr.Configuration.HasHeaderRecord = true;
if (csvr.ReadHeader())
{
sb.AppendLine("----- Header -----");
sb.AppendLine(csvr.FieldHeaders.Aggregate((aggregated, item) => $"{aggregated},{item}"));
}
sb.AppendLine("----- Records -----");
while (csvr.Read())
{
sb.AppendLine(csvr.CurrentRecord.Aggregate((aggregated, item) => $"{aggregated},{item}"));
}
}
sb.AppendLine();
}
}
}
return sb.ToString();
}
}
}
결과
경고이지만.
Reference
이 문제에 관하여(ASP.NET WebAPI를 사용하여 ZIP 파일 업로드에서 추출한 각 파일을 임시 저장 또는 없이 수행하는 샘플), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/daiyama/items/6ef56da00c344a42b87f
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
<form class="form-inline" id="myform">
<div class="form-group">
<div class="hidden">
<input id="file-input" type="file">
</div>
<input type="text" id="file-name" class="form-control" placeholder="select file..." readonly>
</div>
<div class="form-group">
<div class="btn-group">
<button type="button" id="browse" class="btn btn-info">Browse</button>
<button type="button" id="upload" class="btn btn-info">upload</button>
</div>
</div>
</form>
이쪽도 html에 맞춘 소세공이 하고 있습니다.
중요한 것은 $.ajax 당입니다 (뭐 흠 느낌인가).
$(function () {
$('#browse').on('click', function () {
$('#file-input').trigger('click');
});
$('#file-input').on('change', function () {
$('#file-name').val($(this).val());
});
$('#upload').on('click', function () {
upload();
});
});
var upload = function () {
var formData = new FormData();
$file = $('#file-input');
formData.append('file', $file[0].files[0]);// マルチでも送信できるがとりあえず1つ
$.ajax({
url: "http://localhost:54302/api/mytestapi",// この辺は環境に合わせて
type: "POST",
data: formData,
cache: false,
contentType: false,
processData: false,
})
.done(function (data, textStatus, jqXHR) {
alert(data);
})
.fail(function (jqXHR, textStatus, errorThrown) {
alert("fail");
});
};
C#(WebAPI Controller)
컨트롤러에 써야 할지는 제쳐두고.
이번은 샘플이므로 컨트롤러만.
(하지만 파일 형식 처리를 모델로 가져오는 것은 다르다고 생각합니다.)
이번에는 자신이 여러 CSV 파일을 ZIP하고 업로드하기 위해 CsvHelper를 사용하고 있습니다.
using CsvHelper;
using System;
using System.Collections.Generic;
using System.IO;
using System.IO.Compression;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Text;
using System.Web.Http;
namespace WebApplication1.Controllers
{
public class MyTestApiController : ApiController
{
// POST api/<controller>
public string Post(HttpRequestMessage request)
{
if (!request.Content.IsMimeMultipartContent())
return string.Empty;
var sb = new StringBuilder();
MultipartMemoryStreamProvider provider = request.Content.ReadAsMultipartAsync().Result;
foreach (var content in provider.Contents)
{
// 各Contentを処理
using (var ms = new MemoryStream(content.ReadAsByteArrayAsync().Result))
using (var za = new ZipArchive(ms))
{
foreach (var entry in za.Entries)
{
sb.AppendLine($"===== {entry.FullName} =====");
using (var sr = new StreamReader(entry.Open()))
using (var csvr = new CsvReader(sr))
{
csvr.Configuration.HasHeaderRecord = true;
if (csvr.ReadHeader())
{
sb.AppendLine("----- Header -----");
sb.AppendLine(csvr.FieldHeaders.Aggregate((aggregated, item) => $"{aggregated},{item}"));
}
sb.AppendLine("----- Records -----");
while (csvr.Read())
{
sb.AppendLine(csvr.CurrentRecord.Aggregate((aggregated, item) => $"{aggregated},{item}"));
}
}
sb.AppendLine();
}
}
}
return sb.ToString();
}
}
}
결과
경고이지만.
Reference
이 문제에 관하여(ASP.NET WebAPI를 사용하여 ZIP 파일 업로드에서 추출한 각 파일을 임시 저장 또는 없이 수행하는 샘플), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/daiyama/items/6ef56da00c344a42b87f
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
using CsvHelper;
using System;
using System.Collections.Generic;
using System.IO;
using System.IO.Compression;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Text;
using System.Web.Http;
namespace WebApplication1.Controllers
{
public class MyTestApiController : ApiController
{
// POST api/<controller>
public string Post(HttpRequestMessage request)
{
if (!request.Content.IsMimeMultipartContent())
return string.Empty;
var sb = new StringBuilder();
MultipartMemoryStreamProvider provider = request.Content.ReadAsMultipartAsync().Result;
foreach (var content in provider.Contents)
{
// 各Contentを処理
using (var ms = new MemoryStream(content.ReadAsByteArrayAsync().Result))
using (var za = new ZipArchive(ms))
{
foreach (var entry in za.Entries)
{
sb.AppendLine($"===== {entry.FullName} =====");
using (var sr = new StreamReader(entry.Open()))
using (var csvr = new CsvReader(sr))
{
csvr.Configuration.HasHeaderRecord = true;
if (csvr.ReadHeader())
{
sb.AppendLine("----- Header -----");
sb.AppendLine(csvr.FieldHeaders.Aggregate((aggregated, item) => $"{aggregated},{item}"));
}
sb.AppendLine("----- Records -----");
while (csvr.Read())
{
sb.AppendLine(csvr.CurrentRecord.Aggregate((aggregated, item) => $"{aggregated},{item}"));
}
}
sb.AppendLine();
}
}
}
return sb.ToString();
}
}
}
경고이지만.
Reference
이 문제에 관하여(ASP.NET WebAPI를 사용하여 ZIP 파일 업로드에서 추출한 각 파일을 임시 저장 또는 없이 수행하는 샘플), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/daiyama/items/6ef56da00c344a42b87f텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)