У меня возникли проблемы с загрузкой файла в мой 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](https://i.stack.imgur.com/8M16I.png)
Однако изначально мне нужно опубликовать этот файл из приложения реакции, и мой код выглядит так:
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](https://i.stack.imgur.com/stkwX.png)