Send multipart/form-data files with angular using $http

后端 未结 3 1054
予麋鹿
予麋鹿 2020-11-30 01:17

I know there are a lot of questions about this, but I can\'t get this to work:

I want to upload a file from input to a server in multipart/form-data

I\'ve tr

相关标签:
3条回答
  • 2020-11-30 01:42

    In Angular 6, you can do this:

    In your service file:

     function_name(data) {
        const url = `the_URL`;
        let input = new FormData();
        input.append('url', data);   // "url" as the key and "data" as value
        return this.http.post(url, input).pipe(map((resp: any) => resp));
      }
    

    In component.ts file: in any function say xyz,

    xyz(){
    this.Your_service_alias.function_name(data).subscribe(d => {   // "data" can be your file or image in base64 or other encoding
          console.log(d);
        });
    }
    
    0 讨论(0)
  • 2020-11-30 01:43

    Take a look at the FormData object: https://developer.mozilla.org/en/docs/Web/API/FormData

    this.uploadFileToUrl = function(file, uploadUrl){
            var fd = new FormData();
            fd.append('file', file);
            $http.post(uploadUrl, fd, {
                transformRequest: angular.identity,
                headers: {'Content-Type': undefined}
            })
            .success(function(){
            })
            .error(function(){
            });
        }
    
    0 讨论(0)
  • 2020-11-30 01:46

    Here's an updated answer for Angular 4 & 5. TransformRequest and angular.identity were dropped. I've also included the ability to combine files with JSON data in one request.

    Angular 5 Solution:

    import {HttpClient} from '@angular/common/http';
    
    uploadFileToUrl(files, restObj, uploadUrl): Promise<any> {
      // Note that setting a content-type header
      // for mutlipart forms breaks some built in
      // request parsers like multer in express.
      const options = {} as any; // Set any options you like
      const formData = new FormData();
    
      // Append files to the virtual form.
      for (const file of files) {
        formData.append(file.name, file)
      }
    
      // Optional, append other kev:val rest data to the form.
      Object.keys(restObj).forEach(key => {
        formData.append(key, restObj[key]);
      });
    
      // Send it.
      return this.httpClient.post(uploadUrl, formData, options)
        .toPromise()
        .catch((e) => {
          // handle me
        });
    }
    

    Angular 4 Solution:

    // Note that these imports below are deprecated in Angular 5
    import {Http, RequestOptions} from '@angular/http';
    
    uploadFileToUrl(files, restObj, uploadUrl): Promise<any> {
      // Note that setting a content-type header
      // for mutlipart forms breaks some built in
      // request parsers like multer in express.
      const options = new RequestOptions();
      const formData = new FormData();
    
      // Append files to the virtual form.
      for (const file of files) {
        formData.append(file.name, file)
      }
    
      // Optional, append other kev:val rest data to the form.
      Object.keys(restObj).forEach(key => {
        formData.append(key, restObj[key]);
      });
    
      // Send it.
      return this.http.post(uploadUrl, formData, options)
        .toPromise()
        .catch((e) => {
          // handle me
        });
    }
    
    0 讨论(0)
提交回复
热议问题