将图像发布到 asp.net API 2 和 Angular 2

2023-12-03

i get 415(不支持的媒体类型)当我尝试将图像发布到 ASP.Net API 2 时 此资源不支持请求实体的媒体类型“multipart/form-data”。","exceptionMessage": "没有 MediaTypeFormatter 可用于从媒体类型为“multipart/form-data”的内容中读取“附件”类型的对象。

我的后端发布方法:

    [HttpPost]
    [Route("api/listing/{listingId}/Attachment/")]
    public async Task<dynamic> Post([FromBody] Attachment model)
    {

        var Attachments = new Attachment
        {

            ListingId = model.ListingId,
            Content = model.Content,
            Description = model.Description,
            Name = model.Name,
            MimeType = model.MimeType,
            Size = model.Size,
            CreatedOn = DateTime.UtcNow,
            UpdatedOn = model.UpdatedOn,
        };

        return await DataStore.InsertDynamicAsync(Attachments);
    } 

and 我的前端方法:

  onChangeImage(e: any) {
      console.log(this.className + 'onChangeImage.event=' +JSON.stringify(event));
console.log(this.className + 'onChangeImage._listingAttachmentService undefined?: ' + (this._listingAttachmentService === undefined));
const inputElement = this.fileInput.nativeElement;

const fileList = inputElement.files;
const files = [];
console.log('AttachmentsTabComponent: file count = ' + fileList.length);

if (fileList.length > 0) {

  for (let i = 0; i < fileList.length; i++) {

    // get item
    const file = fileList.item(i);
    files.push(file);
    const model: Attachment = {
      listingId: this.listing.id,

      mimeType: file.type,
      name: file.name,
      size: file.size,
      updatedOn: file.lastModifiedDate
    };



    const reader = new FileReader();
    reader.readAsDataURL(file);

    console.log(this.className + 'onChangeImage.listingAttachmentService (before reader.onload) undefined?: ' + (this._listingAttachmentService === undefined));

    reader.onload = (readerEvt: any) => {
      const binaryString = readerEvt.target.result;

      //base-64 encoded ASCII string
      model.content = btoa(binaryString);

      console.log(this.className + 'onChangeImage.listingAttachmentService (during reader.onload) undefined?: ' + (this._listingAttachmentService === undefined));

      console.log(this.className + 'ListingAttachmentModel.content.length=' + JSON.stringify(model.content.length));
      // this._listingAttachmentService.add(model);
    };
  }

  // try to clear the file input
  try {
    // TODO: fix this
    this.fileForm.nativeElement.reset();
    inputElement.value = '';
    if (inputElement.value) {
      inputElement.type = 'text';
      inputElement.type = 'file';
    }
  } catch (e) { }

  this._listingAttachmentService.upload(this.listing.id, files)
    .subscribe(data => {
      this.listing.attachments = data;
    });
}
    }

和我的列表AttachmentService

upload(listingId: number, files: Array<File>) {

this._logger.debug('method upload() entered');
this._logger.debug('upload() listingId=' + listingId);
this._logger.debug('this.fileToUpload.length=' + files.length);

var self = this;

return Observable.create(observer => {
  console.log('creating Observable');
  let formData: FormData = new FormData(),
    xhr: XMLHttpRequest = new XMLHttpRequest();

  formData.append('listingId', listingId);
  for (let i = 0; i < files.length; i++) {
    formData.append('uploads[]', files[i], files[i].name);
  }

  xhr.onreadystatechange = () => {
    if (xhr.readyState === 4) {
      if (xhr.status === 200) {
        observer.next(JSON.parse(xhr.response));
        observer.complete();
      } else {
        observer.error(xhr.response);
      }
    }
  };

  let newbaseUrl = self.baseUrl + listingId + '/attachment/' ;
  xhr.open('POST', newbaseUrl, true);
  xhr.send(formData);
})
  .catch(this.handleError);
}

您应该使用自定义 MediaTypeFormatter。更多信息请点击这里:http://www.asp.net/web-api/overview/formats-and-model-binding/media-formatters和一个样本在这里http://blog.marcinbudny.com/2014/02/sending-binary-data-along-with-rest-api.html#.V5MDDzV7qYg

    public class CustomFormatter : MediaTypeFormatter
    {
        public CustomFormatter()
        {
            SupportedMediaTypes.Add(new MediaTypeHeaderValue("multipart/form-data"));
        }

        public override bool CanReadType(Type type)
        {
            return type == typeof(Attachment);
        }

        public override bool CanWriteType(Type type)
        {
            return false;
        }

        public async override Task<object> ReadFromStreamAsync(Type type, Stream readStream, HttpContent content, IFormatterLogger formatterLogger)
        {
            var provider = await content.ReadAsMultipartAsync();

            var modelContent = provider.Contents
                .FirstOrDefault(c => c.Headers.ContentType.MediaType == "application/json"); // Can also use ContentDisposition.Name.Normalize == "attachment"

            var attachment = await modelContent.ReadAsAsync<Attachment>();

            var fileContents = provider.Contents
                .Where(c => c.Headers.ContentType.MediaType == "image/jpeg").FirstOrDefault(); // can also use ContentDisposition.Name.Normalize() == "image"

            attachment.Content = await fileContents.ReadAsByteArrayAsync();

            return attachment;

        }
    }

注册自定义媒体格式化程序:

private void ConfigureWebApi(HttpConfiguration config)
{
    //other code here
    config.Formatters.Add(new CustomFormatter());
}   

帖子会喜欢下面

POST http://localhost/api/FileUpload HTTP/1.1
Content-Type: multipart/form-data; boundary=-------------------------acebdf13572468
User-Agent: Fiddler
Content-Length: 88778

---------------------------acebdf13572468
Content-Type: application/json; charset=utf-8
Content-Disposition: form-data; name=attachment

{"ListingId":"testl"}
---------------------------acebdf13572468
Content-Disposition: form-data; name=image; filename=image.jpg
Content-Type: image/jpeg

Image content
---------------------------acebdf13572468--

希望这可以帮助。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将图像发布到 asp.net API 2 和 Angular 2 的相关文章

随机推荐

  • 如何在解构赋值语法中使用特殊字符(如连字符)? [复制]

    这个问题在这里已经有答案了 我很好奇为什么这看起来不可能 const a b special one a 1 b 2 special one 3 output gt missing after property id 在未来的 ES 版本中
  • 计算双精度数组中所有元素的总和

    我在使用数组进行递归时有点困惑 有人可以纠正我的错误吗 新更新 根据所需的问题 某些行无法编辑 double sum of array double x int size static double sum lt can be edit i
  • 如何创建多个本地通知

    我试图在我的应用程序中创建多个本地通知 但由于某种原因 只有第一个通知弹出 其余的不起作用 这是我的代码 我有一个名为克里亚警报 它负责创建通知 在该类中我有以下方法 void setarNotificacao NSInteger quan
  • 我可以通过通话事件启动我的应用程序吗?

    当用户通过 iPhone 拨打电话时 如何启动我的应用程序 为此 应用程序是否需要始终作为服务运行 或者即使它关闭 我也可以从调用中运行它吗 在 iOS 中无法启动应用程序来响应呼叫
  • 在返回向量的函数上使用 Numpy Vectorize

    numpy vectorize接受函数 f a gt b 并将其转换为 g a gt b 当a and b是标量 但我想不出为什么它不能与 b 作为标量一起使用的原因ndarray或列表 即 f a gt b 和 g a gt b 例如 i
  • CNUI 错误 设置了选择谓词,但委托未实现 contactPicker:didSelectContact:

    我尝试使用新的iOS 9 0CNContactPickerViewController在 Objective C 中选择联系人 我设置了委托并实施CNCContactPickerDelegate方法 import ContactsUI im
  • IE 11 兼容性视图

    我的网站在 IE11 中无法正常工作 我们发现它由于 XSLTProcessor 和 XPathEvaluator 而被破坏 因为 IE 不再支持它们 我做了一些研发 发现 IE9 和 IE10 也不支持它 但我的网站在 IE9 和 IE1
  • 如何在 WKWebView 中禁用 iOS 11 和 iOS 12 拖放功能?

    长按图片或链接WKWebView在 iOS 11 和 12 上启动拖放会话 用户可以拖动图像或链接 我怎样才能禁用它 我确实找到了一个涉及方法调配的解决方案但也可以在 WKWebView 中禁用拖放 而无需任何调整 注意 请参阅下面针对 i
  • Java 类链接解析步骤或初始化是否会导致加载其他解析的类?

    我正在浏览 JVM 规范文档和 JLS 了解 java 中的类加载机制 这是我的理解 首先 当主类被要求加载时 它 查看该类的二进制表示是否已经存在 是否已加载 如果没有 类加载器将从中加载类文件 磁盘 联动步骤 验证 准备和解决 初始化
  • 如何绑定CallScreeningService?

    我想获取通话详细信息并阻止通话 如果需要 由于 TelecomManager endCall 方法已被弃用 并且根据文档 建议使用 CallScreeningService https developer android com refer
  • 如何计算a^b^c mod p?

    我正在尝试计算一些正整数 a b c p 的 a b c mod p 一种可能的 也是显而易见的 方法是使用快速模幂 它将运行在O log b c clog b 虽然我不介意这里的效率 但这种方法的明显缺点是您需要一个显式的二进制表示b c
  • SSIS获取执行Sql任务结果集对象

    我有一个执行 sql 任务项 它从存储过程中获取多行数据 声明了一个变量ObjShipment在变量表下并使用以下信息将其分配到结果集下 Result Set Full result set Result Name 0 Variable N
  • ExtJS grid:在控制器中处理操作列的点击事件

    我有一个视图 EmployeeList 里面有一个网格 我需要处理来自控制器的操作列的单击事件 这是视图 Ext define ExtApp view Employees extend Ext panel Panel alias widge
  • 在 PHP 中使用表达式(连接字符串)初始化类成员变量

    我想使用表达式初始化类成员 var 通过连接字符串 为什么以下不可能 class aClass const COMPANY NAME A Company var COPYRIGHT TEXT Copyright 2011 COMPANY N
  • 有 Xamarin xaml 文件的设计器吗? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 目前不接受答案 我目前正在启动 Xamarin 应用程序 现在我想知道是否有任何形式的 UI 设计器 这样我就不必在设计时一遍又一遍地启动应用程序来测试 UI 可惜
  • 在 CSS 中使用多个 @font-face 规则

    我怎样才能使用超过 font face我的 CSS 规则 我已将其插入到我的样式表中 body background fff url images body bg corporate gif repeat x padding bottom
  • 在 Laravel 5.5 中处理 PostTooLargeException

    我正在尝试处理PostTooLargeException在我的 Laravel 5 5 应用程序中 当我尝试通过表单上传太大的文件时 我收到PostTooLargeException我成功地抓住了app Exceptions Handler
  • 检查对象是否是构造函数 - IsConstructor

    我想检查 JavaScript 值是否是构造函数 即它是否具有 Construct 内部方法 ECMAScript 定义是构造函数 它正是这样做的 但这是一个内部操作 所以我想效仿一下 我考虑过尝试在一个实例化或子类化try声明 但两者都不
  • 实体框架:路径中存在非法字符。 (连接字符串)(MVC3)

    我就是无法解决这个问题 我正在尝试在我的 MVC3 项目中使用实体框架 但每次我打电话Entities context new Entities 我收到此错误 路径中存在非法字符 我确实知道这与我的连接字符串有关 如下所示 metadata
  • 将图像发布到 asp.net API 2 和 Angular 2

    i get 415 不支持的媒体类型 当我尝试将图像发布到 ASP Net API 2 时 此资源不支持请求实体的媒体类型 multipart form data exceptionMessage 没有 MediaTypeFormatter