ASP. NET Загрузка файла Web API - PullRequest
0 голосов
/ 30 марта 2020

У меня возникли проблемы с загрузкой файла в мой Web Api. Я создал пустой проект Web API и попробовал этот код с некоторой страницы MSDN :

public class UploadController : ApiController
    {
        [HttpPost]
        [Route("api/upload/file")]
        public async Task<HttpResponseMessage> PostFormData()
        {
            // Check if the request contains multipart/form-data.
            if (!Request.Content.IsMimeMultipartContent())
            {
                throw new HttpResponseException(HttpStatusCode.UnsupportedMediaType);
            }

            string root = System.Web.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 fileData in provider.FileData)
                {
                    Trace.WriteLine(fileData.Headers.ContentDisposition.FileName);//get FileName
                    Trace.WriteLine("Server file path: " + fileData.LocalFileName);//get File Path
                }
                return Request.CreateResponse(HttpStatusCode.OK, "pass upload file successed!");
            }
            catch (System.Exception e)
            {
                return Request.CreateErrorResponse(HttpStatusCode.InternalServerError, e);
            }
        }

    }

Чтобы убедиться, что я не ошибаюсь в части интерфейса, которую я использую почтальоном : postman with form-data

Однако изначально мне нужно опубликовать этот файл из приложения реакции, и мой код выглядит так:

const UploadFile = connect(
    mapStateToProps,
    mapDispatchToProps,
)(
    class extends React.Component {
        constructor(props) {
            super(props);
            this.state = {
                file: '',
            };
        }

        async submit(e) {
            e.preventDefault();
            const formData = new FormData();
            formData.append('file', this.state.file, { type: 'text/csv' });

            // I am dispatching redux action here, but to simplify tests with file upload I am using axios post right here
            // i tried different urls with and without action names
            post('http://localhost:44370/api/upload/file', formData)
                .catch(error => {
                    console.log(error);
                })
                .then(() => {});
        }
        setFile(e) {
            this.setState({ file: e.target.files[0] });
        }

        render() {
            return (
                <div className="container-fluid">
                    <form onSubmit={e => this.submit(e)}>
                        <div className="col-sm-12 btn btn-primary">
                            File Upload
                        </div>
                        <h1>File Upload</h1>
                        <input type="file" onChange={e => this.setFile(e)} />
                        <button className="btn btn-primary" type="submit">
                            Upload
                        </button>
                    </form>
                </div>
            );
        }
    },
);

Но я так и не смог достичь точки останова на моем действии, ни от приложения реакции, ни от почтальона. Я всегда получаю 404, не найденный через почтальона, и ERR_CONNECTION_ABORTED из приложения реакции.

Я также попробовал это решение и множество других различных подходов из inte rnet, также пытался использовать HttpFileBase , но по-прежнему безрезультатно.

Есть идеи о том, как изменить код, чтобы можно было загружать файл в действие контроллера Web Api?

PS. Я смог загрузить файл в основной контроллер asp. net с таким кодом:

[HttpPost]
        public async Task<IActionResult> Post(IFormFile file)
        {
            if (file == null || file.Length == 0)
                return Content("file not selected");

            var fileId = Guid.NewGuid();

            var path = Path.Combine(
                Directory.GetCurrentDirectory(), "uploads",
                file.FileName);

            using (var stream = new FileStream(path, FileMode.Create))
                await file.CopyToAsync(stream);
        }

и тем же кодом реакции, но мне нужно решение для не. net основного проекта, просто обычный asp. net веб-интерфейс.

ОБНОВЛЕНИЕ Согласно комментарию, я попробовал html страницу только с формой:

<form
  name="form1"
  method="post"
  enctype="multipart/form-data"
  action="http://localhost:44370/api/upload/file"
>
  <div>
    <label for="file">File</label>
    <input name="file" type="file" />
  </div>
  <div>
    <input type="submit" value="Submit" />
  </div>
</form>

Но Я получаю 404 not found

1 Ответ

2 голосов
/ 30 марта 2020

Боже мой ... Посмотрите на сообщение об ошибке на скриншоте.

это не только 404, это 404.13 - Content length too large.. Вы пытаетесь загрузить очень большой файл?

https://social.msdn.microsoft.com/Forums/ie/en-US/d3214048-67d2-4328-a34e-1459e629512a/http-file-upload-error-in-request-limit?forum=vsdebug

Вам следует изменить параметры фильтрации запросов, если вы хотите разрешить загрузку файлов огромных размеров.

Посмотрите на раздел «Что можно попробовать» на скриншоте:

Проверьте настройку конфигурации / system.webServer / security / requestFiltering / requestLimits@maxAllowedContentLength в applicationhost.config или в Интернете. файл конфигурации

...