Публикация данных и файлов с помощью Aurelia в ASP.NET webapi

Я пытаюсь добавить вход с загрузкой файла в мое приложение.

Это мой взгляд с двумя входами, одним текстом и одним файлом:

<template>
  <form class="form-horizontal" submit.delegate="doImport()">
    <div class="form-group">
      <label for="inputLangName" class="col-sm-2 control-label">Language key</label>
      <div class="col-sm-10">
        <input type="text" value.bind="languageKey" class="form-control" id="inputLangName" placeholder="Language key">
      </div>
    </div>
    <div class="form-group">
      <label for="inputFile" class="col-sm-2 control-label">Upload file</label>
      <div class="col-sm-10">
        <input type="file" class="form-control" id="inputFile" accept=".xlsx" files.bind="files">
      </div>
    </div>
    <div class="form-group">
      <div class="col-sm-offset-2 col-sm-10">
        <button type="submit" class="btn btn-default">Do import</button>
      </div>
    </div>
  </form>
</template>

В моем webapi у меня есть этот код, который я скопировал и вставил изВот:

public class ImportLanguageController : ApiController
{
    public async Task<HttpResponseMessage> Post()
    {
        // Check if the request contains multipart/form-data.
        if (!Request.Content.IsMimeMultipartContent())
        {
            throw new HttpResponseException(HttpStatusCode.UnsupportedMediaType);
        }

        string root = HttpContext.Current.Server.MapPath("~/App_Data");
        var provider = new MultipartFormDataStreamProvider(root);

        try
        {
            // Read the form data.
            await Request.Content.ReadAsMultipartAsync(provider);

            // This illustrates how to get the file names.
            foreach (MultipartFileData file in provider.FileData)
            {
                //Trace.WriteLine(file.Headers.ContentDisposition.FileName);
                //Trace.WriteLine("Server file path: " + file.LocalFileName);
            }
            return Request.CreateResponse(HttpStatusCode.OK);
        }
        catch (System.Exception e)
        {
            return Request.CreateErrorResponse(HttpStatusCode.InternalServerError, e);
        }
    }
}

Наконец-то у меня есть модель зрения в Аурелии:

import {inject} from 'aurelia-framework';
import {HttpClient, json} from 'aurelia-fetch-client';

@inject(HttpClient)
export class Import {
  languageKey = null;
  files = null;

  constructor(http){
    http.configure(config => {
      config
        .useStandardConfiguration();
    });

    this.http = http;
  }

  doImport() {
    //What goes here??
  }
}

Поэтому мой вопрос в том, какая логика входит в мою функциюdoImport? Я не уверен, что код в моем методе контроллера в webapi правильный, не стесняйтесь комментировать.

Ответы на вопрос(1)

Решение Вопроса

Это должно помочь вам начать:

doImport() {
  var form = new FormData()
  form.append('language', this.languageKey)
  form.append('file', this.files)
  //Edit, try this if the first line dont work for you
  //form.append('file', this.files[0])

  this.http.fetch('YOUR_URL', {
     method: 'post',
     body: form
  })
  .then( response => { 
     // do whatever here

  });
}

В зависимости от ответа вебапи, который вы предоставляете (если есть), вы можете использовать следующее:

.then( response => response.json() )
.then( response => {
   // do whatever here
});

Я также должен упомянуть, что fetch использует COR, поэтому, если вы получаете какие-либо ошибки CORS, вам может потребоваться включить их на стороне сервера.

Вот gist.run для части Aurelia (публикация не будет работать, если вы не измените URL):https://gist.run/?id=6aa96b19bb75f727271fb061a260f945

 sibi13 окт. 2016 г., 07:56
@John idk y append не работает, наконец-то выдает пустую «форму»
 John08 июн. 2016 г., 08:47
Пришлось сделать небольшую модификациюform.append('file', this.files[0]).

Ваш ответ на вопрос