複数ファイルをUploadする。(javascript, C#)

JavaScript

今回は手抜きのためjQueryを使ってます。
基本的にはinput type=”file”からfilesを引っ張って、FormDataにappendします。
んで、そのあとにPostするだけ。

Uploadの進捗も表示したいケースが多いと思うので、xhr.uploadのprogressイベントを購読して、プログレスバーを変化させます。

javascript

var uploadButton = document.getElementById('uploadButton');
uploadButton.onclick = function () {
    var files = fileInput.files;
    if (!files || files.length === 0) {
        return;
    }

    var formData = new FormData();

    for (let i = 0; i < files.length; i++) {
        var file = files[i];
        formData.append('file' + i.toString(), file);
    }

    var progress = document.getElementById('uploadProgress');
    $.ajax({
        url: apiUrl,
        type: 'POST',
        data: formData,
        cache: false,
        enctype: 'multipart/form-data',
        contentType: false,
        processData: false,
        xhr: function () {
            var xhr = $.ajaxSettings.xhr();
            if (xhr.upload) {
                xhr.upload.addEventListener(
                    'progress',
                    function (e) {
                        var percent = parseInt((e.loaded / e.total) * 10000) / 100;
                        progress.setAttribute('value', percent);
                        progress.textContent = percent;
                    },
                    false
                );
            }
            return xhr;
        }
    })
        .done(function (data) {
            console.log(data);
        })
        .fail(function (err) {
            console.log(err);
        });
};
HTML

<progress id="uploadProgress" value="0" max="100">0 %</progress>
<input type="file" id="uploadFileInput" multiple>
<button type="button" id="uploadButton">アップロード</button>
C#

var files = context.Request.Files;
if (files.Count == 0)
{
    return;
}

for (vari = 0; i < files.Count; i++)
{
    var file = files[i];
    var filePath = @"C:\Test\" + file.FileName;
    file.SaveAs(filePath);

    var extension = Path.GetExtension(file.FileName);
    var fileNameWithoutExtension = Path.GetFileNameWithoutExtension(file.FileName);
    xml.Files.Files.Add(new UploadImageFile {FileName = fileNameWithoutExtension, Extension = extension});
}

サーバー側のコードはこう。
HttpFileCollectionクラスであるcontext.Request.Filesを取得し、
for文でHttpPostedFileクラスのオブジェクトを1つずつ取り出して処理します。

コメント