Я пытаюсь загрузить файл Excel в мой Web Api и DO STUFF с его содержимым. У меня есть часть extJs, отправляющая файл через кнопку загрузки. (код ниже)

Моя проблема в том, что я не знаю, как создать часть webApi для обработки файла Excel. Я предполагаю, что у меня должен быть HttpPost.

Поддельный WebApi:

public string SampleUploadFile()
{
    return _repo.UploadFile();
}

Код Extjs

xtype: 'form',
//renderTo: 'fi-form', //(5)
fileUpload: true, //(1)
width: 500,
frame: true,
title: 'Position Sheet Upload Form',
bodyPadding: '10 10 0',
//bodyStyle: 'padding: 10px 10px 0 10px;',

defaults: {
    anchor: '100%',
    allowBlank: false,
    msgTarget: 'side',
    labelWidth: 50
},

//labelWidth: 50,
items: [{
    xtype: 'fileuploadfield',
    emptyText: 'Select an image',
    fieldLabel: 'Image',
    name: 'file', //(2)
    buttonText: 'Choose a file'
}],
buttons: [{
    text: 'Save',
    handler: function () {
        if (this.up('form').getForm().isValid()) {
            this.up('form').getForm().submit({
                url: 'Home/Upload',
                waitMsg: 'Uploading your file...',
                success: function (form, o) //(3)
                {
                    Ext.Msg.show({
                        title: 'Result',
                        msg: o.result.result,
                        buttons: Ext.Msg.OK,
                        icon: Ext.Msg.INFO
                    });
                },
                failure: function (form, o) //(4)
                {
                    Ext.Msg.show({
                        title: 'Result',
                        msg: o.result.error,
                        buttons: Ext.Msg.OK,
                        icon: Ext.Msg.ERROR
                    });
                }
            });
        }
    }
}]

Кто-нибудь знает как это сделать? Должен ли я иметь параметр, который является файлом?

3
solarissf 23 Мар 2017 в 18:35

2 ответа

Лучший ответ

Вы можете обрабатывать файлы следующим образом:

public void UploadFile(HttpRequestMessage request)
{
    HttpContext context = HttpContext.Current;
    HttpPostedFile postedFile = context.Request.Files["file"];
    // ...
}
5
Ludovic Feltz 23 Мар 2017 в 15:46

Еще одно возможное решение. Метод веб-API использует пакет ClosedXML для чтения потока, содержащего содержимое excel:

using ClosedXML.Excel;

public async void UploadFile()
{
    var context = HttpContext.Current;

    if (!Request.Content.IsMimeMultipartContent())
    {
        throw new HttpResponseException(HttpStatusCode.UnsupportedMediaType);
    }

    var provider = new MultipartMemoryStreamProvider();
    await Request.Content.ReadAsMultipartAsync(provider);

    foreach (HttpContent ctnt in provider.Contents)
    {
        //now read individual part into STREAM
        var stream = await ctnt.ReadAsStreamAsync();
        if (stream.Length != 0)
        {
            //handle the stream here
            using (XLWorkbook excelWorkbook = new XLWorkbook(stream))
            {
                var name = excelWorkbook.Worksheet(1).Name;
            }
        }
    }
}
1
RBT 30 Ноя 2017 в 12:30