如何将带有 formgroup 值的图像/文件上传到 API?

2024-03-19

当服务执行http.post时,如何上传图像并将其添加到表单中? 示例产品模块需要名称、价格、封面图片。 我尝试使用许多可以从互联网、论坛等获得的方法。 但对于这个问题仍然没有任何线索。

我正在使用模型驱动的表单,并在选择图像时附加它,并且我尝试在发送到 API 之前打印出表单的值。 console.log 结果的附图:

仅供参考:我正在使用基于 PHP Laravel 的 API。我尝试从“$request->file('image');”获取图像

有人可以帮助我处理这个案子吗? 谢谢。


第 1 部分. 通过 FormData 将文件上传到 API

在您的服务文件中,例如upload.service.ts您需要创建通过 POST 方法上传文件的功能。下面是这个函数的一个例子:

getUploadHeaders() {
    let headers = new Headers({'Accept': 'application/json'});
    headers.delete('Content-Type');
    return headers;
}    

addNewPost(newPost: FormData): Observable<FormData> {
    const endpoint = 'https://yourApiUrl.com'; 
    return this.http
        .post(endpoint, newPost, { headers: this.getUploadHeaders() })
        .catch((e) => this.handleError(e));
}

现在您应该在组件中创建上传功能,例如upload.component.ts。这是使用 FormData 进行上传功能的示例。

fileToUpload: File = null;

constructor(private uploadService: UploadService) { }

handleFileInput(files: FileList) {
  this.fileToUpload = files.item(0);
}


saveFileToApi() {
  const saveForm: FormData = new FormData();      
  if (this.fileToUpload) {
    // if you need/want to append other fields to API endpoint
    saveForm.append('name', this.name);
    saveForm.append('link', this.link);
    saveForm.append('description', this.description);
    // if you have to append number
    saveForm.append('age', this.age.toString());
    // append image
    saveForm.append('fileFieldNameOnYourApi', this.fileToUpload, this.fileToUpload.name);
  }

  this.uploadService.addNewPost(saveForm).subscribe(() => {
    console.log('Upload success!');
  }, error => {
    console.log('Upload failed!');
  });
}

In saveFileToApi- 您还可以附加表单的其他字段。请注意,您应该将数字字段转换为字符串。Here https://developer.mozilla.org/en-US/docs/Web/API/FormData/Using_FormData_Objects您可以阅读有关 FormData 对象用法的更多信息。

要通过 FormData 上传文件,您需要 3 个参数:API 端点上的 propertyName、文件和该文件的名称。 而在你的upload.component.html你需要有这样的形式:

<form (ngSubmit)="onSubmit()">     
    <label for="fileField">Chose file to upload</label>
    <input type="file"
           id="fileField"
           name="fileField"
           (change)="handleFileInput($event.target.files)">
    <button type="submit">Speichern</button>
</form>

有关 FormData 的更多详细信息,请阅读this https://developer.mozilla.org/en-US/docs/Web/API/FormData有关 FormData.append() 的更多信息,请阅读this https://developer.mozilla.org/en-US/docs/Web/API/FormData/append.

第2部分.从API获取上传的图像

你应该设置responseType: ResponseContentType.Blob在您的 GET-Request 设置中,因为这样您就可以将图像获取为 blob,并稍后将其转换为 base64 编码的源。你上面的代码不好。如果您想正确执行此操作,请创建单独的服务以从 API 获取图像。因为在组件中调用HTTP-Request是不好的。

这是一个工作示例:

Create image.service.ts or use upload.service.ts从第 1 部分开始(也许您可以为该服务指定另一个名称)并输入以下代码:

    getImage(imageUrl: string): Observable<File> {
        return this.http
            .get(imageUrl, { responseType: ResponseContentType.Blob })
            .map((res: Response) => res.blob());
    }

现在您需要在您的中创建一些函数image.component.ts获取图像并以 html 形式显示。

要从 Blob 创建图像,您需要使用 JavaScriptFileReader。 这是创建新的函数FileReader并监听 FileReader 的 load-Event。结果,该函数返回 base64 编码的图像,您可以在 img src-attribute 中使用它:

imageToShow: any;

createImageFromBlob(image: Blob) {
       let reader = new FileReader();
       reader.addEventListener("load", () => {
          this.imageToShow = reader.result;
       }, false);

       if (image) {
          reader.readAsDataURL(image);
       }
}

现在你应该使用你创建的ImageService从 api 获取图像。您应该订阅数据并将该数据提供给createImageFromBlob-功能。这是一个示例函数:

getImageFromService() {
      this.isImageLoading = true;
      this.imageService.getImage(yourImageUrl).subscribe(data => {
        this.createImageFromBlob(data);
        this.isImageLoading = false;
      }, error => {
        this.isImageLoading = false;
        console.log(error);
      });
}

现在您可以使用您的imageToShow- HTML 模板中的变量如下所示:

<img [src]="imageToShow"
     alt="Place image title"
     *ngIf="!isImageLoading; else noImageFound">
<ng-template #noImageFound>
     <img src="fallbackImage.png" alt="Fallbackimage">
</ng-template>

我希望这个描述很容易理解,并且您可以在您的项目中使用它。

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

如何将带有 formgroup 值的图像/文件上传到 API? 的相关文章

  • cURL 错误 77:设置证书验证位置时出错:CAfile

    我正在使用 Firebase php SDKlink https firebase php readthedocs io en latest index html并在 Windows 10 上的 XAMPP 服务器上使用 laravel 最
  • 如何在 Zend Framework 中存储 cron 作业的脚本?

    因为 ZF 的所有 URL 都依赖于 mod 重写 所以我并不清楚应该在哪里存储用于 cron 作业的本地脚本 有人有什么建议 或者有 正式接受 的方式吗 我用模块化目录结构 http framework zend com manual e
  • 使用 IE11 的工作程序使用 multipart/form-data 发送二进制数据

    我正在尝试发送multipart form data来自 IE 的工作人员 我已经使用 Chrome Firefox Safari 完成了此操作formData对象 不支持IE 我需要一个手动的 我发送的二进制数据是 crypto js 加
  • 具有动态表单名称的 form_widget

    在我的 Twig 模板中 我有一个 FOR 循环 它创建多个表单 如下所示 for thing in things set form id myform thing Id set form name attribute form myfor
  • 使用 PHP 将值插入可编辑 PDF,并保持可编辑状态

    我有一个带有可编辑字段的 PDF 我希望将 HTML 表单中的值传递到此 PDF 中 我尝试过使用 FPDF 并且它有效 但是将值传递到 PDF 后 pdf 中的字段不再可编辑 另一个缺点是 在将值传递到 PDF 时 我们必须为每个字段指定
  • Magento补丁安装失败

    从以下位置下载并运行 Magento PHP 5 4 支持补丁 Magento CE v1 7 0 0 1 7 0 2 时http www magentocommerce com download http www magentocomme
  • Symfony2中如何获取所有post参数? [复制]

    这个问题在这里已经有答案了 我想获取a的所有post参数symfony http symfony com Form I used all parameter this gt get request gt getParameterHolder
  • Node.js 中的 PHP exit()/die() 等价物是什么

    什么是 PHP die http www php net manual de function die php http www php net manual de function die php 在 Node js 中等效吗 https
  • AWS S3 上传的图像已损坏

    我正在 AWS ec2 ubuntu 机器上工作 我的代码在 cakephp 中 当我尝试将任何图像上传到 AWS S3 时 它都会损坏 虽然它在核心 php 代码中运行良好 这是我的控制器代码 if this gt User gt sav
  • Angular 2 Material 2 日期选择器日期格式

    我不知道如何更改材料2日期选择器的日期格式 我已阅读文档 但我不明白我实际上需要做什么 datepicker默认提供的输出日期格式为f e 6 9 2017 我想要实现的目标是将格式更改为类似的格式9 Jun 2017或任何其他 文档htt
  • FakeAsync/tick (Async/whenStable) 与 detectorChanges()

    您能帮我区分这两件事吗 根据我的理解 如果你只使用 observable 你可以使用 detectorChanges 因此 您可以直接更改组件属性或监视服务调用并返回可观察的值 然后调用 detectorChanges 更改将在 html
  • 使用PHP套接字发送和接收数据

    我正在尝试通过 PHP 套接字发送和接收数据 一切正常 但是当我尝试发送数据时 PHP 不发送任何内容 Wireshark 告诉我发送的数据长度为 0 我正在使用这段代码
  • 如何在没有引用的情况下复制对象?

    PHP5 OOP 有据可查对象通过引用传递 http php net manual en language oop5 references php默认情况下 如果这是默认的 在我看来 有一种非默认的方式可以在没有参考的情况下进行复制 如何
  • Angular 2 获取当前路线

    所以我需要以某种方式检查我是否在主页上执行某些操作 而在其他页面上则不执行此操作 该组件也在所有页面上导入 如果我在主页上 如何检测该组件 Thanks 尝试这个 import Router from angular router expo
  • 在 Fabric.js 中按宽度/高度在另一个画布对象内居中和缩放画布对象

    Goal 将一个对象 水平和垂直 置于另一个对象 矩形或组 的中心canvas via Fabric js或者通过Javascript保持原始对象的长宽比相同 但也不超过父对象的宽度 高度比例 父对象 矩形或组 不会居中于canvas元素
  • 将 MySQL 结果作为 PHP 数组

    mysql 表 config name config value allow autologin 1 allow md5 0 当前的 php 代码 sth mysql query SELECT rows array while r mysq
  • PHP文件上传

    如果我想在文件名转到服务器的永久位置 而不是临时位置 之前更改文件名 我该如何执行此操作 代码如下
  • 为什么 PHP 中不允许“传统”类型提示?

    刚刚发现类型提示 http php net manual en language oop5 typehinting phpPHP 中允许 但不适用于整数 字符串 布尔值或浮点数 为什么 PHP 不允许对整数 字符串等类型进行类型提示 从 P
  • Angular Libraries Monorepo:是否可以为每个库使用不同的版本?

    只是一个简单的问题 我似乎找不到答案 我正在尝试构建一个应该能够使用 angular cli v8 的 monorepo 但仍然能够编译和构建为 v2 v3 v4 等制作的库 主要是组件和服务 版本之间发生了很多变化 所以让我们举个例子 V
  • 在 PHP 中模拟 jQuery.ajax 请求

    我必须在 PHP 中模拟 AJAX 请求 就像在 jQuery 中一样 我当前的代码在这里 原始 AJAX 调用 不得修改 ajax type POST url someFile php data data success function

随机推荐

  • Telegram 机器人:如何隐藏内联键盘? PHP

    我制作了一个带有内联键盘的电报机器人 来自InlineKeyboardMarkup 我喜欢hide 或使其one time 用户响应后的键盘 我怎样才能在 PHP 中做到这一点 这是我的机器人的视图 有方法editMessageReplyM
  • 在 Backbone.js 中使用状态并登录用户

    我需要检查用户是否已登录并经过身份验证 然后才能让我的用户使用我的backbone js基于应用程序 用户身份验证作为属性存储在本机主干模型中 我在启动主路由器之前通过调用进行检查Backbone history start 这样 未经身份
  • 使用 React 内联样式设置背景图像

    我正在尝试访问静态图像以在内联中使用backgroundImageReact 中的属性 不幸的是 我对如何做到这一点已经一无所知 一般来说 我认为你只是做了如下操作 import Background from images backgro
  • 扩展方法中的 ArgumentNullException 或 NullReferenceException?

    在空实例上调用扩展方法 扩展方法不允许 时 您认为抛出的最佳异常类型是什么 由于扩展方法只不过是静态方法 您可能会认为它应该是 ArgumentNullException 但另一方面 它们的使用方式与实例方法类似 因此使用 NullRefe
  • 检测主线程之外的 UI 操作

    注 此问题涉及从后台线程调用 UIKit 时发出警告 https stackoverflow com questions 10976424 warn on calls to uikit from background threads但没有给
  • 如何将进度条连接到函数?

    我正在尝试将进度条连接到我的项目的函数 这是我到目前为止所拥有的 但我很确定它什么也没做 def main pgBar start function1 function2 function3 function4 pgBar stop 这是我
  • Postgresql - 在大数据库中使用数组的性能

    假设我们有一个包含 600 万条记录的表 有 16 个整数列和少量文本列 它是只读表 因此每个整数列都有一个索引 每条记录大约 50 60 字节 表名称为 项目 服务器为 12 GB RAM 1 5 TB SATA 4 核 所有 postg
  • 如何在[关闭]下实现带点的画廊滑动

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 如何实现画廊下点滑动 我需要显示当前
  • HTML 内容提取的最新技术水平如何?

    有很多关于 HTML 内容提取的学术工作 例如 Gupta Kaiser 2005 从可访问的网页中提取内容 http citeseerx ist psu edu viewdoc summary doi 10 1 1 60 357 以及这里
  • 链接到 CMAKE 中的ExternalProject_add 依赖项

    我在运行 Ninja 时收到以下 ninja 构建错误 我的 CMAKE 构建命令是cmake G Ninja DCMAKE BUILD TYPE Release ninja error ext deps api src ext api b
  • Angular2:表中带有 *ngFor 的复选框

    我有一个 HTML 表 其中每行都有一个关联的复选框 默认情况下 最初会检查所有行
  • 以编程方式查找对象使用的内存

    有没有办法以编程方式准确确定 C 中对象使用的内存量 我不关心这个过程有多慢 所以左右运行 GC 是可以接受的 当然我更喜欢更高效的东西 序列化对象并查看结果长度似乎不太准确 在对此方法的简单测试中 我看到整数返回值 54 Using GC
  • 如何在 PHP 中使用 fetch() API POST 方法抓取数据?

    我正在尝试使用fetch API POST 方法以获取 PHP 中的 POST 数据 这是我尝试过的 var x hello fetch url method post body x then function response retur
  • Microsoft 的 strncat 读取超出源缓冲区边界的字节

    我观察到 Microsoft 实现中存在一个有趣的问题strncat 它超出了源缓冲区 1 个字节 考虑以下代码 include
  • 设置android相机发送灰度图像

    Android 相机可以通过编程方式设置为发送灰度图像吗 我不是在询问收到图像后的转换 而是在询问一种以编程方式设置它的方法 就像我们对 fps 分辨率等所做的那样 您是在谈论内置相机应用程序 通过意图 还是在您的应用程序内部 如果它是内置
  • 如何更改应用程序中使用的默认键盘的背景颜色?

    因此 我正在制作的应用程序需要使用较暗的键盘 否则内容和键盘之间的对比度太高 因此我需要更改与 EditText 交互时显示的键盘 我已经看了一下安卓软键盘 http developer android com resources samp
  • dplyr的arrange()使用什么排序算法?

    主要是出于好奇 我想知道 dplyr 的排列函数使用什么排序算法 我读到使用 R 的最常见的排序算法是选择排序 但我找不到有关range 的任何细节 我只是对排序算法有点兴趣 并且很好奇这个函数使用什么 我查看了排列函数的源代码 但我无法真
  • 如何推迟 Norton Secure Site Seal 的加载?

    我正在网站中显示 Norton Secure Site Seal 并且我想提高页面速度以推迟密封脚本的加载 我所做的所有尝试都失败了 我只找到了这个页面提到了这一点 link http www webpagetest org forums
  • 使用 C# 5 异步等待在多个游戏帧上执行的内容

    我儿子正在编写一个简单的 RPG 游戏 其中有许多非玩家角色 又名 NPC 每个 NPC 都有一个相关的 脚本 来控制其行为 我们将使用迷你自定义脚本语言来编写这些行为 但我现在想知道在 C 5 Async 中是否会更好 举一个非常简单的例
  • 如何将带有 formgroup 值的图像/文件上传到 API?

    当服务执行http post时 如何上传图像并将其添加到表单中 示例产品模块需要名称 价格 封面图片 我尝试使用许多可以从互联网 论坛等获得的方法 但对于这个问题仍然没有任何线索 我正在使用模型驱动的表单 并在选择图像时附加它 并且我尝试在