ASP.NET WebAPI를 사용하여 ZIP 파일 업로드에서 추출한 각 파일을 임시 저장 또는 없이 수행하는 샘플

16740 단어 WebAPI아 SP. 네 T
직장에서 여러 CSV를 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();
        }
    }
}

결과



경고이지만.

좋은 웹페이지 즐겨찾기