C# 上载文件时出现错误415不支持的媒体类型

C# 上载文件时出现错误415不支持的媒体类型,c#,angular,typescript,asp.net-core,rxjs,C#,Angular,Typescript,Asp.net Core,Rxjs,我知道已经有一个错误,但它没有解决上述错误 这是我在API控制器中的PUT操作,在Swagger中运行良好: [HttpPut("{id}/upload")] public async Task<IActionResult> UploadFile(string id, IFormFile file) { // codes using id above are omitted, nothing to do with the error var path = Pat

我知道已经有一个错误,但它没有解决上述错误

这是我在API控制器中的PUT操作,在
Swagger
中运行良好:

[HttpPut("{id}/upload")]
public async Task<IActionResult> UploadFile(string id, IFormFile file)  
{
    // codes using id above are omitted, nothing to do with the error

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

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

    return Ok();
}
我的服务是:

addFile(someModel: SomeModel, myFile: File): Observable<any> {
    return this.http.put(`${api_url}/api/somemodels/${someModel.id}/upload`, {
        id: someModel.id,
        file: myFile
    });
}
addFile(someModel:someModel,myFile:File):可观察{
返回此.http.put(`${api\u url}/api/somemodels/${someModel.id}/upload`{
id:someModel.id,
文件:myFile
});
}

我还使用了
FormData
尝试上述问题的答案,我将我的
forUpload
文件附加到
FormData
中,但不幸的是,同样的错误。如果在媒体类型中没有任何设置,如何修复此问题?

以下是如何在ASP.Net Core和Angular中上载文件

在角度方面,您需要使用FormData进行提交

const formdata = new FormData();
formdata.append("SomeProp ", "somestring");
formdata.append("Image ", myFile); // change your code accordingly here

return this.http.put(`${api_url}/api/somemodels/${someModel.id}/upload`, {
    formdata
});
在服务器端

public class PostViewModel
{
    public string SomeProp { get; set; }
    public IFormFile Image { get; set; }
}
在我的控制器中,我使用
FromForm
属性

public async Task<IActionResult> SavePost([FromForm]PostViewModel viewModel)

你的代码和前面的答案几乎都能理解。我不想更改控制器中的参数,但需要添加一些内容,即
FromForm
属性。因此,这将是您的新控制器:

[HttpPut("{id}/upload")]
public async Task<IActionResult> UploadFile(string id, [FromForm] IFormFile file)  
{
    // codes here
}
我没有添加整个
someModel
,而是只添加了您的
someModel.id
,因为我注意到这是您在服务中唯一使用的东西,它将更改为:

addFile(formdata: FormData): Observable<any> {
    return this.http.put(`${api_url}/api/somemodels/${formdata.get("id")}/upload`, formdata);
}

addFile(formdata:formdata):可观察)是因为
formdata
服务中的
formdata
根据您之前的回答,正在发送一个JSONify
formdata
而不是
formdata
本身。

感谢您的回复。但是在做了你的建议之后,错误仍然存在。这与
File.type()
有关吗?File.type()是什么意思?你从哪里知道我在当前代码中没有使用它,但我只是好奇是否需要修改文件的mime类型。但是我的代码中没有任何限制任何类型的配置。我现在意识到这不是同一个错误。在错误415之后,它转到CORS相关错误,然后修复。现在它正在返回错误400。这有什么问题吗?是的,我不需要CORS了。我修复了它,但错误400错误请求替换了CORS错误。
public void ConfigureServices(IServiceCollection services)
{
      services.AddCors();
      services.AddMvc();
}

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
    app.UseCors(
        options => options.AllowAnyOrigin().AllowAnyMethod().AllowAnyHeader()
    );

    app.UseMvc();
}
[HttpPut("{id}/upload")]
public async Task<IActionResult> UploadFile(string id, [FromForm] IFormFile file)  
{
    // codes here
}
forUpload: File = null;
@Input() someModel: SomeModel;

save() {

    const addFileFnc = this.theService.addFile.bind(this.theService);

    const formdata = new FormData();
    formdata.append("id", this.someModel.id);
    formdata.append("file", this.forUpload);

    addFileFnc(formdata).subscribe(
        () => { this.ref.close(); },
        (e) => { console.log(e); }
    );
}
addFile(formdata: FormData): Observable<any> {
    return this.http.put(`${api_url}/api/somemodels/${formdata.get("id")}/upload`, formdata);
}