Angular 角2文件上传?

Angular 角2文件上传?,angular,file-upload,Angular,File Upload,我正在尝试在Angular 2中进行文件上传。尝试 let file:FileList = inputEl.files[0]; console.log(file); this.http.post(url, file) .map(res => { return res.headers.get("content-type"); }) .catch(err => {

我正在尝试在Angular 2中进行文件上传。尝试

let file:FileList = inputEl.files[0];
console.log(file);
    this.http.post(url, file)
         .map(res => {
              return  res.headers.get("content-type");
            })
            .catch(err => {
             return Observable.throw(err);
            })
            .subscribe((res) => { // <-- this function
                console.log(res)
            });
let file:FileList=inputEl.files[0];
console.log(文件);
this.http.post(url,文件)
.map(res=>{
返回res.headers.get(“内容类型”);
})
.catch(错误=>{
返回可观察。抛出(错误);
})

.subscribe((res)=>{/Http请求仅在您订阅它们时发送

this._http.post("url", "file")
         .map(res => {
              return  res.headers.get("content-type");
            })
            .catch(err => {
             return Observable.throw(err);
            })
            .subscribe((res) => { // <-- this function
                console.log(res)
            })
this.\u http.post(“url”、“文件”)
.map(res=>{
返回res.headers.get(“内容类型”);
})
.catch(错误=>{
返回可观察。抛出(错误);
})

.subscribe((res)=>{/您的http服务文件:

import { Injectable } from "@angular/core";
import { ActivatedRoute, Router } from '@angular/router';
import { Http, Headers, Response, Request, RequestMethod, URLSearchParams, RequestOptions } from "@angular/http";
import {Observable} from 'rxjs/Rx';
import { Constants } from './constants';
declare var $: any;

@Injectable()
export class HttpClient {
  requestUrl: string;
  responseData: any;
  handleError: any;

  constructor(private router: Router, 
  private http: Http, 
  private constants: Constants, 
  ) {
    this.http = http;
  }

  postWithFile (url: string, postData: any, files: File[]) {

    let headers = new Headers();
    let formData:FormData = new FormData();
    formData.append('files', files[0], files[0].name);
    // For multiple files
    // for (let i = 0; i < files.length; i++) {
    //     formData.append(`files[]`, files[i], files[i].name);
    // }

    if(postData !=="" && postData !== undefined && postData !==null){
      for (var property in postData) {
          if (postData.hasOwnProperty(property)) {
              formData.append(property, postData[property]);
          }
      }
    }
    var returnReponse = new Promise((resolve, reject) => {
      this.http.post(this.constants.root_dir + url, formData, {
        headers: headers
      }).subscribe(
          res => {
            this.responseData = res.json();
            resolve(this.responseData);
          },
          error => {
            this.router.navigate(['/login']);
            reject(error);
          }
      );
    });
    return returnReponse;
  }
}
onChange(event) {
    let file = event.srcElement.files;
    let postData = {field1:"field1", field2:"field2"}; // Put your form data variable. This is only example.
    this._service.postWithFile(this.baseUrl + "add-update",postData,file).then(result => {
        console.log(result);
    });
}
<input type="file" class="form-control" name="documents" (change)="onChange($event)" [(ngModel)]="stock.documents" #documents="ngModel">
print_r($_FILES);
您的html代码:

import { Injectable } from "@angular/core";
import { ActivatedRoute, Router } from '@angular/router';
import { Http, Headers, Response, Request, RequestMethod, URLSearchParams, RequestOptions } from "@angular/http";
import {Observable} from 'rxjs/Rx';
import { Constants } from './constants';
declare var $: any;

@Injectable()
export class HttpClient {
  requestUrl: string;
  responseData: any;
  handleError: any;

  constructor(private router: Router, 
  private http: Http, 
  private constants: Constants, 
  ) {
    this.http = http;
  }

  postWithFile (url: string, postData: any, files: File[]) {

    let headers = new Headers();
    let formData:FormData = new FormData();
    formData.append('files', files[0], files[0].name);
    // For multiple files
    // for (let i = 0; i < files.length; i++) {
    //     formData.append(`files[]`, files[i], files[i].name);
    // }

    if(postData !=="" && postData !== undefined && postData !==null){
      for (var property in postData) {
          if (postData.hasOwnProperty(property)) {
              formData.append(property, postData[property]);
          }
      }
    }
    var returnReponse = new Promise((resolve, reject) => {
      this.http.post(this.constants.root_dir + url, formData, {
        headers: headers
      }).subscribe(
          res => {
            this.responseData = res.json();
            resolve(this.responseData);
          },
          error => {
            this.router.navigate(['/login']);
            reject(error);
          }
      );
    });
    return returnReponse;
  }
}
onChange(event) {
    let file = event.srcElement.files;
    let postData = {field1:"field1", field2:"field2"}; // Put your form data variable. This is only example.
    this._service.postWithFile(this.baseUrl + "add-update",postData,file).then(result => {
        console.log(result);
    });
}
<input type="file" class="form-control" name="documents" (change)="onChange($event)" [(ngModel)]="stock.documents" #documents="ngModel">
print_r($_FILES);
1.记住,当您提交带有文件的表单数据时,标题应该是空白的
let headers=新的headers();
let options=newrequestoptions({headers:headers});
2.其余部分可从上面的示例@Bharat Chauhan中学习
3.我用所有其他标题进行了测试,但如果它的左键为空,它就工作了!
第一步。
第二步。
fileChangeEvent(e:any):无效{
操作:可观察;
let fileList:fileList=e.target.files;
let file:file=fileList[0];
让formData:formData=newformdata();
formData.append('file',file,file.name);
commentOperation=this.test1Service\uU1.submitComment(formData);
commentOperation.subscribe(
文件上传=>{
console.log(文件上传)
}, 
错误=>{
//记录错误(如果有)
控制台日志(err);
}
);
}
步骤3:
提交建议(正文:任何):可观察{
let headers=新的headers();
let options=newrequestoptions({headers:headers});
使用post请求返回this.http.post(this.commentsUrl,body,options)/…文件
.map((res:Response)=>res.json())/…并对响应调用.json()以返回数据
.catch((error:any)=>Observable.throw(error.json().error | | |'Server error'));/…如果有错误
}
第4步:PHP:
标题('Access-Control-Allow-Origin:');
如果($\u服务器['REQUEST\u METHOD']!='POST'){
echo json_编码(数组('status'=>false));
出口
}
$path='uploads/';
如果(isset($\u文件['file'])){
$originalName=$_文件['file']['name'];
$ext='....pathinfo($originalName,pathinfo_扩展名);
$generatedName=md5($_FILES['file']['tmp_name'])。$ext;
$filePath=$path.$generatedName;
如果(!是可写的($path)){
echo json_编码(数组(
“状态”=>false,
'msg'=>'目标目录不可写。'
));
出口
}
如果(移动上传的文件($文件['file']['tmp\u名称],$filePath)){
echo json_编码(数组(
“状态”=>true,
“originalName”=>$originalName,
“generatedName”=>$generatedName
));
}
}
否则{
回声json_编码(
数组('status'=>false,'msg'=>No file upload')
);
出口
}

文件更改(事件){

}

我的参考资料来自:
但是在将“内容类型”更改为“enctype”并将“event.target.files”更改为“event.srcmelement.files”后,它开始工作了。

您是否真的订阅了这篇文章?@jornsharpe实际上是angular 2的新手。能够完成简单的表单提交,但无法集中精力完成文件上传,也不确定java中的结构上传文件的代码…这并不能回答我的问题。你能给出一个答案吗?在
.post(…)之后是什么
?这可能就是问题所在;你必须订阅Observable才能让它们做任何事情。我建议你看Angular 2 http的教程。Observable是惰性的,只有在订阅回调时才会执行。谢谢,我现在可以看到POST调用发生,但我仍然无法看到文件上传,可以吗你可以帮我弄清楚我的POST呼叫到底应该是什么样子,我想上传一个文件及其一些元数据。我还没有自己上传一个文件,所以我不清楚它应该是什么样子。这看起来像一个完整的示例。请查看: