How do you POST a FormData object in Angular 2?

前端 未结 4 1862
隐瞒了意图╮
隐瞒了意图╮ 2020-12-07 22:27

I need to upload a file and send some json along with it, I have this function:

POST_formData(url, data) {
        var headers = new Headers(), authtoken = l         


        
相关标签:
4条回答
  • 2020-12-07 22:57

    It's an Open Isuue on Angular2 Git Repository, and there is also a Pull Request waiting to be merged, hope that it will be merged soon.


    Alternatively,

    You can use XMLHttpRequest Object directly, for that.

    And don't forget to set the header

    xhr.setRequestHeader("enctype", "multipart/form-data");
    
    // IE workaround for Cache issues
    xhr.setRequestHeader("Cache-Control", "no-cache");
    xhr.setRequestHeader("Cache-Control", "no-store");
    xhr.setRequestHeader("Pragma", "no-cache");
    

    on the XMLHttpRequest that you make.


    Similar Questions:

    How to upload file in Angular2

    Angular 2 File upload from input type=file

    Angular2 post uploaded file

    0 讨论(0)
  • 2020-12-07 22:58

    Template:

    <label class="btn btn-primary">
      <input type="file" style="display: none;" multiple="true" (change)="fileChange($event)" accept=".xml">
      <span>Click Me!</span>
    </label>
    

    UPD: Angular 5 - HttpClient + Typescript

    onFileUpload(event: EventTarget) {
    
      const eventObj: MSInputMethodContext = <MSInputMethodContext>event;
      const target: HTMLInputElement = <HTMLInputElement>eventObj.target;
      const files: FileList = target.files;
    
      const formData: FormData = new FormData();
    
      for (let i = 0; i < files.length; i++) {
        formData.append('file', files[i]);
      }
    
      // POST
      this.httpClient.post<AnalyzedData>(uploadUrl, formData).subscribe(...);
    }
    

    old Http lib - before Angular 4.3:

    fileChange(event) {
        let files = event.target.files;
            if (files.length > 0) {
            let formData: FormData = new FormData();
            for (let file of files) {
                 formData.append('files', file, file.name);
            }
            let headers = new Headers();
            headers.set('Accept', 'application/json');
            let options = new RequestOptions({ headers: headers });
            this.http.post(uploadURL, formData, options)
                .map(res => res.json())
                .catch(error => Observable.throw(error))
                .subscribe(
                data => {
                    // Consume Files
                    // ..
                    console.log('uploaded and processed files');
                },
                error => console.log(error),
                () => {
                    this.sleep(1000).then(() =>
                        // .. Post Upload Delayed Action
                    )
                });
        }
    }
    
    0 讨论(0)
  • 2020-12-07 23:03

    I know this has been marked answered and is pretty old, however I had an issue posting the FormData object to an OpenIdConnect AuthServer, and the file upload examples above weren't what I was looking for.

    Here is my service that gets an OpenIdAuthToken:

    import { Injectable } from '@angular/core';
    import { Http, RequestOptions, Headers, URLSearchParams} from '@angular/http'
    import { OpenIdTokenRequest, SmartData } from '../model/openid-token-request';
    import { OpenIdToken } from '../model/openid-token';
    import 'rxjs/add/operator/map';
    import 'rxjs/Rx';
    import { Observable } from 'rxjs';
    
    @Injectable()
    
    export class TokenService {
    
        constructor(private _http: Http) { }
    
        getToken(requestData: OpenIdTokenRequest, smartData: SmartData) {
            let _urlParams = new URLSearchParams();
            _urlParams.append('code', requestData.code);
            _urlParams.append('grant_type', requestData.grantType);
            _urlParams.append('redirect_uri', requestData.redirectUri);
            _urlParams.append('client_id', requestData.clientId);
    
            let _url = smartData.tokenUri;
            let _options = this.getTokenPostOptions();
    
            return this._http.post(_url, _urlParams, _options)
                .map(response => <OpenIdToken>response.json())
        }
    
        private getTokenPostOptions(): RequestOptions {
    
            let headers = new Headers({ 'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8' });
            let options = new RequestOptions({ headers: headers });
    
            return options;
        }
    
    }
    
    0 讨论(0)
  • 2020-12-07 23:22

    I solved this problem, don't need content-type at all.

    See here, https://stackoverflow.com/a/45879409/2803344

    Also see here to check how to set headers, Angular2 - set headers for every request

    2017.8.25

    0 讨论(0)
提交回复
热议问题