【问题标题】:How to post image in Angular2?如何在Angular2中发布图像?
【发布时间】:2018-10-07 21:09:46
【问题描述】:

实际上是 Angular2 的新手。在 post 方法中,我不知道如何在 angular2 中上传图像。 其他字段也有(产品名称、类型、类别等)以及我想发布的图像。 下面我提到了我的 Html、conponent.ts 和 service.ts。 那么请告诉我该怎么做?

HTML

          <div class="form-group image">
            <input type="file" (change)="onfileSelected($event)" class="form-control" multiple="">
            <span style="padding-left:22%">
              <a href="#">
                <i class="fa fa-pencil fa-lg" aria-hidden="true"></i>
              </a>&nbsp; | &nbsp;
              <a href="#">
                <i class="fa fa-trash-o fa-lg" aria-hidden="true"></i>
              </a>
            </span>
          </div>

Component.ts

 onfileSelected(event) {
    console.log(event);
    this.selectedFile = <File>event.target.files[0];
  }



 createNewProduct(productForm: NgForm) {

    this.productService.save_user(productForm.value)
      .subscribe(response => {
        const toast_parameter = this.notificationService.getToast('success', 'New Product', 'Inserted Successfully');
        this.toastConfig = toast_parameter.config;

        this.toasterService.popAsync(toast_parameter.toast);
      },
        error => {
          const toast_parameter = this.notificationService.getToast('error', 'New Product', 'Error Occurred!!');
          this.toastConfig = toast_parameter.config;
          this.toasterService.popAsync(toast_parameter.toast);
        });

  }

Service.ts

  save_user(product_data: any): Observable<any[]> {

        const httpOptions = {
            headers: new HttpHeaders({
                'Content-Type': 'application/json',
            }),
        };
        return this.http.post('http://localhost:8000/product/', product_data, httpOptions)
            .map(response => response)
            .catch(error => Observable.throw(error.statusText));
    };

model.py

class Product(models.Model):
    image = models.ImageField(upload_to='myphoto/%Y/%m/%d/', null=True, max_length=255)
    pro_name =  models.CharField(max_length=25)
    description = models.CharField(max_length=150)
    category = models.ForeignKey(Category,on_delete=models.CASCADE)
    sales = models.CharField(max_length=25)
    cost = models.CharField(max_length=25)
    taxable = models.BooleanField(default=False, blank=True)
    tax_details= models.CharField(max_length=250)
    type_units = models.ForeignKey(Units, on_delete=models.CASCADE)
    hsn = models.CharField(max_length=10)

serializer.py

class ProductSerializer(serializers.HyperlinkedModelSerializer):    
    image = serializers.ImageField(required=False, max_length=None, allow_empty_file=True,  use_url=True)
    class Meta:
        model = Product
        fields = ('id','image','pro_name','description','category','sales','cost','taxable','tax_details','type_units','hsn')

【问题讨论】:

  • 您的onfileSelected 方法在组件中的什么位置?
  • 对不起,我忘记上传了。现在你可以检查它了。

标签: angular angular2-template angular2-forms angular2-services angular2-directives


【解决方案1】:

您好,您可以将使用 http 调用更改为 XMLHttpRequest

插入的服务更改吗
file:File;
onfileSelected(event: EventTarget) {
    let eventObj: MSInputMethodContext = <MSInputMethodContext> event;
    let target: HTMLInputElement = <HTMLInputElement> eventObj.target;
    let files: FileList = target.files;
    if(files) {
        this.file: File = files[0];
      }
}
public save_user(filedata: File) {
    let url = 'your url'
    if (typeof filedata != 'undefined') {
        return new Promise((resolve, reject) => {
            let formData: any = new FormData();
            let xhr = new XMLHttpRequest();
            formData.append('image', filedata, filedata.name);
            xhr.open('POST', url, true);
            xhr.send(formData);
            xhr.onreadystatechange = function () {
                if (xhr.readyState == XMLHttpRequest.DONE) {
                    resolve(JSON.parse(xhr.responseText));
                }
            }
        });

    }
}

更新:

this.service.saveUser(this.file)
                .then(data=>{
                    console.lo(' image File uploaded')
                })

在您的后端,您可以从 request.FILES

获取
image = request.FILES['image']

【讨论】:

  • 在可观察的模式中如何做到这一点。
【解决方案2】:

要发送图像/文件,您需要以FormData 的形式发送数据,因此将您的全部数据添加到 formData 并将其发送回您的服务器

<input type="file" (change)="onfileSelected($event.target.files)" class="form-control" multiple="">



onfileSelected(event) {
 console.log(event);
 this.form.image = <File>event.target.files[0];
}

createNewProduct() {
  this.productService.save_user(this.setFormData(this.form.value))
    .subscribe(response => {
      const toast_parameter = this.notificationService.getToast('success', 'New Product', 'Inserted Successfully');
      this.toastConfig = toast_parameter.config;

      this.toasterService.popAsync(toast_parameter.toast);
    },
      error => {
        const toast_parameter = this.notificationService.getToast('error', 'New Product', 'Error Occurred!!');
        this.toastConfig = toast_parameter.config;
        this.toasterService.popAsync(toast_parameter.toast);
      });

}

setFormData(param) {
  let formData = new FormData();
  for (let i = 0; i < Object.keys(param).length; i++) {
    let key = Object.keys(param)[i];
    let data = param[key];
    formData.append(key, data);
  }
  return formData;
}

【讨论】:

  • 您能告诉我我想在 Component.ts 中提及的内容吗?
  • @SudharsanVenkatraj 请检查更新的答案。您必须将您的整个数据设置为 formData 格式,并用您的 formname 替换您的,如果您需要帮助,请告诉我。
  • 你提到了我想要替换的表单名。实际上我是这项技术的新手,所以请告诉我我想在那里提及的内容。
  • 用我提到的关键字formname替换你的表单模型名称
  • 我强烈建议先学习角度形式和基本概念:)
猜你喜欢
  • 1970-01-01
  • 2017-03-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-19
  • 2013-06-10
  • 1970-01-01
相关资源
最近更新 更多