当前位置: 首页 > 知识库问答 >
问题:

如何修复Angular 6中文件上载时415不支持的媒体类型

柳俊逸
2023-03-14

我工作在一个。Net Core Web Api和Angular应用程序。我创建了一个控制器,它将图像链接到数据库中的一个项目:

[HttpPut("[Action]/{id}")]
public async Task<ActionResult<Item>> LinkItemToIcon(int id, IFormFile file)
{
    var items = await _context.Items.FirstOrDefaultAsync(t => t.Id == id);

    if (items == null)
    {
        return BadRequest("item null");
    }

    if (file.Length <= 0)
    {
        return BadRequest("fileEmpty");
    }

    using (var memoryStream = new MemoryStream())
    {
        await file.CopyToAsync(memoryStream);
        Item item = new Item() { Id = items.Id, Icon = memoryStream.ToArray() };
        _context.Entry(items).CurrentValues.SetValues(item);
        _context.SaveChanges();

        return Ok(file);
    }
}

它在Postman中运行良好,但当我想使用控制器时,我得到一个错误:

Headers:HttpHeaders{normalizedNames:Map(0),lazyUpdate:null,Headers:Map(0)}消息:“的Http失败响应https://localhost:5001/api/LinkItemToIcon:415不支持的媒体类型“
名称:“HttpErrorResponse”
确定:错误
状态:415
状态文本:“不支持的媒体类型”
url:https://localhost:5001/api/LinkItemToIcon"

你可以在我的角应用程序中看到我的html:

<input type="file" (change)="onSelectedFile($event) name="file">
<input type="button" (click)="linkItem()">

您可以看到我的组件:

this.selectedFile : File = null ;
onSelectedFile(e){
    this.selectedFile = e.target.files[0]
}
LinkItem(){
    var formData = new FormData();
    formData.append("file",this.selectedFile, this.selectedFile.name)
    this.administrator.LinkItemToIcon(1,formData).subscribe(
       r => console.log(r),
       err => console.log(err)
    )
}

现在我的服务是:

  LinkItemToIcon(id,file){
return this.http.put<UploadFile>(`${this.config.catchApiUrl()}Item/LinkItemToIcon/`+ id, file
,{
  headers : new HttpHeaders({
    'Content-Type' : 'application/json'
  })}
)

}

我的断点结果:

谢谢你的帮助。断点结果

当我想订阅LinkItemToIcon时,我有一个错误消息

FormData未定义

此外,我可以在代码中更改我的内容类型,即应用程序/json到多部分/表单数据,因为我有一个

放https://localhost:5001/api/Item/LinkItemToIcon/1500(内部服务器错误)

CORS策略阻止了从https://localhost:5001/api/Item/LinkItemToIcon/1http://localhost:4200对XMLHttpRequest的访问:请求的资源上不存在访问控制允许起源标头。

HttpErrorResponse

共有2个答案

夏何平
2023-03-14

您必须通过javascript/Angular发送吗?有一种简单得多的方式可以直接从表格中发送:

<form id="yourid" action=".../yourpath/LinkItemToIcon" method="PUT" enctype="multipart/form-data">
 <input type="file" name="file"/>
 <input type="hidden" name="id" value="yourID"/>
 <button type="submit">
  <span>Submit</span>
 </button>
</form>

如果传递的id有问题,可以通过属性路由传递

郁宾鸿
2023-03-14

按照以下步骤进行工作演示:

>

  • 控制

    [HttpPut("[Action]/{id}")]
    public async Task<ActionResult> LinkItemToIcon(int id, IFormFile file)
    {
        //your operation
    }
    

    Angular

    selectedFile : File = null;
    onSelectedFile(e){
        this.selectedFile = e.target.files[0];
    }
    linkItem(){
        var formData = new FormData();
        formData.append("file", this.selectedFile, this.selectedFile.name)
        this.LinkItemToIcon(1, formData).subscribe(
        r => console.log(r),
        err => console.log(err)
        )
    }
    LinkItemToIcon(id, formData) {
        return this.http.put(`api/SampleData/LinkItemToIcon/` + id, formData);
    }
    

  •  类似资料:
    • 我的理解是我需要泽西-媒体-多部分依赖 当我尝试发出post请求时,我得到一个415不受支持的媒体类型错误,我不确定为什么。它被设置为消耗MULTIPART_FORM_DATA,参数是一个multipartfile。 编辑我添加了如下配置, 现在我得到了 这里是我的Spring Boot类,它包含附加配置

    • 我知道已经有一个类似的问题,但它没有解决上述错误。 这是我在API控制器中的PUT操作,在中运行良好: 以下是我的网页上的代码: HTML 打字稿 我的服务是: 我还使用了尝试上述问题的答案,我将我的文件附加到中,但不幸的是,同样的错误。如果媒体类型中没有任何设置,如何修复此问题?

    • 问题内容: 自数小时以来,我一直在尝试纠正http错误,但它仍显示不支持的页面。我在邮递员中添加标题。 这是我的Java代码 这是我的档案 问题答案: 通过和如何在响应流和请求流之间对对象进行序列化和反序列化。 将会发生的是,将从提供者的注册表中进行搜索,以查找可以处理的媒体类型。如果找不到,则Jersey无法处理该请求,并将发送415不支持的媒体类型。通常,你还应该在服务器端记录一个异常。不知道

    • 我已经创建了一个示例web服务来进行post调用。 我使用的是Jersey JAX-RS和Maven。

    • 问题内容: 我正在尝试使用jQuery 1.6(Jackson 2.1.1 和Spring 3.2.0 )通过JSON通过该方法向数据库中插入和/或更新数据。 JS代码如下。 通过URL映射的Spring控制器内部的方法如下。 服务器按照问题的含义进行响应, 415不支持的媒体类型 标头信息如下所示。 整个文件如下。 当我删除一个方法参数并仅用于接受请求参数时,它可以工作。 问题答案: 浏览器发送

    • 问题内容: 我正在使用Spring 3.2,并尝试使用ajax发布请求来提交json对象数组。如果相关,我转义了所有特殊字符。 我的HTTP状态为415。 我的控制器是: jQuery是: 我发布的数组中的对象之一的示例是以下json: 错误是: 为什么会发生此错误-有人知道吗? 问题答案: 您可以尝试使用。它没有任何问题