首页 > 解决方案 > 如何将 FormData 与 ABP 的内置 RestService 一起使用?

问题描述

我想在基于 ABP 的应用程序中上传文件。

我的应用程序服务是这样创建的:

public async Task<IEnumerable<ScheduleDto>> UploadAsync(IFormFile File)

生成这样的 REST API 端点:

在此处输入图像描述

这很好。

现在,当我生成代理时,它创建了这样的客户端代理,它不接受文件作为输入,而是为以下内容创建 JSON IFormFile

upload = (File: IFormFile) =>
  this.restService.request<any, ScheduleDto[]>({
    method: 'POST',
    url: `/api/app/schedule/upload`,
  },
  { apiName: this.apiName });

由于这种方法没有用,我决定使用 ABP 框架提供的 REST 服务,因为它在内部处理成功和失败。我注入RestService组件:

constructor(private matchService: MatchService, private scheduleService: ScheduleService,private rest: RestService) {} //

使用该服务,使用request方法进行调用并将文件传递为FormData,但是当我发布文件时没有任何反应:

UploadSchedule(files) {
  const formData = new FormData();
  formData.append('file', files[0], files[0].name);

  this.rest.request<FormData, ScheduleDto[]>({
    method: 'POST',
    url: `/api/app/schedule`,
    body: formData,
  });
}

我可以使用 Angular 的 HTTP 服务上传文件,所以 API 端点没有问题。似乎 ABP 生成的服务只支持 JSON 数据而不支持FormData.

标签: c#angulartypescriptform-dataabp

解决方案


您可以使用内置的RestService. 您的代码很好,唯一的问题是您没有返回 observable,并且没有人订阅它。还有,{ apiName: this.apiName }好像不见了。简而言之,将UploadSchedule方法更改为以下并从您调用的位置订阅它。

UploadSchedule(files) {
  const formData = new FormData();
  formData.append('file', files[0], files[0].name);

  return this.rest.request<FormData, ScheduleDto[]>({
    method: 'POST',
    url: `/api/app/schedule`,
    body: formData,
  },
  { apiName: this.apiName });
}

推荐阅读