【问题标题】:How to delete file in UploadCare progrmatically in Angular and Ionic?如何在 Angular 和 Ionic 中以编程方式删除 UploadCare 中的文件?
【发布时间】:2021-01-15 10:25:44
【问题描述】:

我在我的项目中使用了 Angular、Ionic 和 Firebase。我使用 Uploadcare 将照片上传和检索到应用程序。我可以删除数据库中的文件,但问题是实际图像仍在 UploadCare 存储中。

这是我的代码:

organization.service.ts - 这是我在 Firebase 和 UploadCare 中连接应用程序的地方

我得到了回应:

来自服务:

来自 page.ts:

更新

网络响应:

这是我在删除带有图像的项目时的网络活动。

organization.service.ts

  deleteOrg(orgId: string){
    return this.http
    .delete(`https://db-student-portal-default-rtdb.firebaseio.com/add-organization/${orgId}.json`)
    .pipe(switchMap(() => {
      return this.allOrg;
    }),
    take(1), 
    tap(orgs => {
      this.organization.next(orgs.filter(o => o.id !== orgId))
    })
    );
  }

  //This is the function to delete the image in UploadCare
  deleteImage(image: any){

    let httpHeader = new HttpHeaders();
    
    httpHeader.set('Authorization', `Uploadcare.Simple ${PUB_KEY}:${SEC_KEY}`);
    httpHeader.set('Accept', 'application/vnd.uploadcare-v0.5+json');

    this.http.delete(`https://api.uploadcare.com/files/${image}/`, {headers: httpHeader});
  }

organization.page.ts

  onDeleteOrg(){
    this.alertCtrl.create({
      header: 'Delete ' + this.loadedOrg.orgName,
      message: 'Do you want to delete this organization?',
      buttons: [
      {
        text: 'Cancel',
        role: 'cancel'
      },
      {
        text: 'Delete',
        handler: () => {
          this.loadingCtrl.create({
            message: 'Deleting Organization: ' + this.loadedOrg.orgName,
            spinner: 'circular'
          }).then(loadEl => {
            loadEl.present();
            
            //THIS IS WHERE THE DELETION HAPPEN (in the Firebase)
            this.orgService.deleteOrg(this.loadedOrg.id).subscribe(() => {
           //THIS IS WHERE THE DELETION HAPPEN (in the UploadCare)
              this.orgService.deleteImage(this.loadedOrg.imageUrl.replace('https://ucarecdn.com/', ''));
              loadEl.dismiss();
              this.router.navigate(['/homepage']);
            });
          });
        }
      }]
    }).then(alertEl => {
        alertEl.present();
    });

  }

【问题讨论】:

    标签: angular firebase ionic-framework uploadcare


    【解决方案1】:

    Simple 授权方案要求您提供公共和秘密 API 密钥(请参阅 Uploadcare REST API reference)。你应该这样修改你的代码

    let httpHeaders = new HttpHeaders();
    httpHeaders.set('Authorization', `Uploadcare.Simple ${YOUR_PUBLIC_KEY}:${YOUR_SECRET_KEY}`);
    httpHeaders.set('Accept', 'application/vnd.uploadcare-v0.5+json');
    this.httpClient.delete(`https://api.uploadcare.com/files/${uuid}/`, { headers: httpHeaders });
    

    请注意,在前端实现文件删除逻辑是不安全的,不建议这样做,因为它会暴露您的密钥。您应该在应用的后端实现它,这样应用的用户就无法访问包含密钥的请求详细信息,或使用基于令牌的Uploadcare auth scheme

    【讨论】:

    • 我试试上面的代码,先生。但网络选项卡中不存在 DELETE 响应
    • 我上面的回复旨在向您展示如何正确构建请求(使用哪个端点,以及设置哪些标头)。抱歉,我不是 Angular 专家,也许您的代码中有些地方需要修复才能发送请求。
    • 感谢您的帮助,先生。但是,这行代码,尤其是 Secret_Key 是否适用于 Uploadcare 的社区包,还是仅在您付费时才适用?
    • Uploadcare REST API 可供用户使用,无论计划如何。因此,如果您订阅了免费的社区计划,则可以使用此 API 方法以及任何其他方法。
    【解决方案2】:

    根据文档,UploadCare 的单个文件删除只需要文件的 UUID,即delete /files/:uuid(参见https://uploadcare.com/docs/rest-api/accessing-files/#delete-file)。

    据我所知,您正在尝试将整个文件数据传递给 API,这在语义上无论如何都不正确(它使用 uuid 来匹配正确的文件)。

    使您的代码适应类似的东西

    let httpHeaders = new HttpHeaders();
    httpHeaders.set('Authorization', 'Uploadcare.Simple');
    httpHeaders.set('UPLOADCARE_PUB_KEY', '6b*****************7');
    this.httpClient.delete(`https://api.uploadcare.com/files/${uuid}/`, { headers: httpHeaders })
    

    应该可以解决问题。

    编辑:我觉得需要更多解释。您尝试使用代码执行的操作是调用 UploadCare 的 delete 端点。根据文档,该端点需要被删除文件的 uuid,即 /files/:uuid 以及 AuthorizationUPLOADCARE_PUB_KEY 标头。为此,您使用HttpHeaders

    在您的版本中,您将该数据作为 FormData 对象的一部分传递(请参阅 docs),我想这应该会引发 HTTP404 错误。

    【讨论】:

    • 感谢先生的回答。正如您在这行代码中看到的,我传递了图像的 uuid:this.orgService.deleteImage(this.loadedOrg.imageUrl.replace('https://ucarecdn.com/', ''));。我在这里传递它:`return this.http.delete(https://api.uploadcare.com/files/${data}/);`
    • 你传入的data 是一个包含多个东西的FormData 对象。但是删除端点所期望的只是您要删除的文件的 uuid。但首先要做的是——您能否编辑您的原始帖子并包括在调用 UploadCare 的删除端点后得到的响应?
    • 先生,我编辑了帖子并添加了回复。如您所见,图像的 url 被替换为空白以仅提取 uuid。
    • 我编辑了我的答案。试试那个版本,看看效果如何。如果它不起作用,请再次编辑您的帖子并包含您从 UploadCare 后端获得的响应(即您在浏览器的网络选项卡中看到的内容)。如有必要,我们会从那里拿走。
    • 我用网络选项卡中的响应编辑了代码先生。但“网络”选项卡中不存在 DELETE 响应。
    猜你喜欢
    • 1970-01-01
    • 2012-04-09
    • 1970-01-01
    • 2014-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多