Ik weet dat dit een zeer algemene vraag is, maar ik kan geen bestand uploaden in Angular 2.
Ik heb geprobeerd
1) http://valor-software.com/ng2-file-upload/en
2) http://ng2-uploader.com/home
…maar mislukt. Heeft iemand een bestand geüpload in Angular? Welke methode heb je gebruikt? Hoe dat te doen? Als er een voorbeeldcode of demolink wordt verstrekt, wordt deze zeer op prijs gesteld.
Antwoord 1, autoriteit 100%
Angular 2 biedt goede ondersteuning voor het uploaden van bestanden. Er is geen bibliotheek van derden vereist.
<input type="file" (change)="fileChange($event)" placeholder="Upload file" accept=".pdf,.doc,.docx">
fileChange(event) {
let fileList: FileList = event.target.files;
if(fileList.length > 0) {
let file: File = fileList[0];
let formData:FormData = new FormData();
formData.append('uploadFile', file, file.name);
let headers = new Headers();
/** In Angular 5, including the header Content-Type can invalidate your request */
headers.append('Content-Type', 'multipart/form-data');
headers.append('Accept', 'application/json');
let options = new RequestOptions({ headers: headers });
this.http.post(`${this.apiEndPoint}`, formData, options)
.map(res => res.json())
.catch(error => Observable.throw(error))
.subscribe(
data => console.log('success'),
error => console.log(error)
)
}
}
met @angular/core”: “~2.0.0” en @angular/http: “~2.0.0”
Antwoord 2, autoriteit 21%
Van de bovenstaande antwoorden bouw ik dit met Angular 5.x
Bel gewoon uploadFile(url, file).subscribe()
aan om een upload te starten
import { Injectable } from '@angular/core';
import {HttpClient, HttpParams, HttpRequest, HttpEvent} from '@angular/common/http';
import {Observable} from "rxjs";
@Injectable()
export class UploadService {
constructor(private http: HttpClient) { }
// file from event.target.files[0]
uploadFile(url: string, file: File): Observable<HttpEvent<any>> {
let formData = new FormData();
formData.append('upload', file);
let params = new HttpParams();
const options = {
params: params,
reportProgress: true,
};
const req = new HttpRequest('POST', url, formData, options);
return this.http.request(req);
}
}
Gebruik het zo in je component
// At the drag drop area
// (drop)="onDropFile($event)"
onDropFile(event: DragEvent) {
event.preventDefault();
this.uploadFile(event.dataTransfer.files);
}
// At the drag drop area
// (dragover)="onDragOverFile($event)"
onDragOverFile(event) {
event.stopPropagation();
event.preventDefault();
}
// At the file input element
// (change)="selectFile($event)"
selectFile(event) {
this.uploadFile(event.target.files);
}
uploadFile(files: FileList) {
if (files.length == 0) {
console.log("No file selected!");
return
}
let file: File = files[0];
this.upload.uploadFile(this.appCfg.baseUrl + "/api/flash/upload", file)
.subscribe(
event => {
if (event.type == HttpEventType.UploadProgress) {
const percentDone = Math.round(100 * event.loaded / event.total);
console.log(`File is ${percentDone}% loaded.`);
} else if (event instanceof HttpResponse) {
console.log('File is completely loaded!');
}
},
(err) => {
console.log("Upload Error:", err);
}, () => {
console.log("Upload done");
}
)
}
Antwoord 3, autoriteit 7%
Met dank aan @Eswar. Deze code werkte perfect voor mij. Ik wil bepaalde dingen aan de oplossing toevoegen:
Ik kreeg een foutmelding: java.io.IOException: RESTEASY007550: Unable to get boundary for multipart
Om deze fout op te lossen, moet u het “Content-Type” “multipart/form-data” verwijderen. Het heeft mijn probleem opgelost.
Antwoord 4, autoriteit 5%
Omdat het codevoorbeeld een beetje verouderd is, dacht ik dat ik een recentere aanpak zou delen, met behulp van Angular 4.3 en de nieuwe(re) HttpClient API, @angular/common/http
export class FileUpload {
@ViewChild('selectedFile') selectedFileEl;
uploadFile() {
let params = new HttpParams();
let formData = new FormData();
formData.append('upload', this.selectedFileEl.nativeElement.files[0])
const options = {
headers: new HttpHeaders().set('Authorization', this.loopBackAuth.accessTokenId),
params: params,
reportProgress: true,
withCredentials: true,
}
this.http.post('http://localhost:3000/api/FileUploads/fileupload', formData, options)
.subscribe(
data => {
console.log("Subscribe data", data);
},
(err: HttpErrorResponse) => {
console.log(err.message, JSON.parse(err.error).error.message);
}
)
.add(() => this.uploadBtn.nativeElement.disabled = false);//teardown
}
Antwoord 5, autoriteit 4%
In Angular 2+ is het erg belangrijkom het Content-Typeleeg te laten. Als je het ‘Content-Type’ instelt op ‘multipart/form-data’ zal de upload niet werken!
upload.component.html
<input type="file" (change)="fileChange($event)" name="file" />
upload.component.ts
export class UploadComponent implements OnInit {
constructor(public http: Http) {}
fileChange(event): void {
const fileList: FileList = event.target.files;
if (fileList.length > 0) {
const file = fileList[0];
const formData = new FormData();
formData.append('file', file, file.name);
const headers = new Headers();
// It is very important to leave the Content-Type empty
// do not use headers.append('Content-Type', 'multipart/form-data');
headers.append('Authorization', 'Bearer ' + 'eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9....');
const options = new RequestOptions({headers: headers});
this.http.post('https://api.mysite.com/uploadfile', formData, options)
.map(res => res.json())
.catch(error => Observable.throw(error))
.subscribe(
data => console.log('success'),
error => console.log(error)
);
}
}
}
Antwoord 6, autoriteit 2%
Ik heb de volgende tool van primen met succes gebruikt. Ik heb geen huid in het spel met primeNg, ik geef alleen mijn suggestie door.
http://www.primefaces.org/primeng/#/fileupload
Antwoord 7, autoriteit 2%
Deze eenvoudige oplossing werkte voor mij: file-upload.component.html
<div>
<input type="file" #fileInput placeholder="Upload file..." />
<button type="button" (click)="upload()">Upload</button>
</div>
En doe vervolgens de upload in de component rechtstreeks met XMLHttpRequest.
import { Component, OnInit, ViewChild } from '@angular/core';
@Component({
selector: 'app-file-upload',
templateUrl: './file-upload.component.html',
styleUrls: ['./file-upload.component.css']
})
export class FileUploadComponent implements OnInit {
@ViewChild('fileInput') fileInput;
constructor() { }
ngOnInit() {
}
private upload() {
const fileBrowser = this.fileInput.nativeElement;
if (fileBrowser.files && fileBrowser.files[0]) {
const formData = new FormData();
formData.append('files', fileBrowser.files[0]);
const xhr = new XMLHttpRequest();
xhr.open('POST', '/api/Data/UploadFiles', true);
xhr.onload = function () {
if (this['status'] === 200) {
const responseText = this['responseText'];
const files = JSON.parse(responseText);
//todo: emit event
} else {
//todo: error handling
}
};
xhr.send(formData);
}
}
}
Als u dotnet core gebruikt, moet de parameternaam overeenkomen met de from-veldnaam. bestanden in dit geval:
[HttpPost("[action]")]
public async Task<IList<FileDto>> UploadFiles(List<IFormFile> files)
{
return await _binaryService.UploadFilesAsync(files);
}
Dit antwoord is een plagiaat van http://blog.teamtreehouse.com/uploading-files- ajax
Bewerken:
Na het uploaden moet u de bestand-upload wissen zodat de gebruiker een nieuw bestand kan selecteren. En in plaats van xmlhttprequest te gebruiken, is het misschien beter om fetch te gebruiken:
private addFileInput() {
const fileInputParentNative = this.fileInputParent.nativeElement;
const oldFileInput = fileInputParentNative.querySelector('input');
const newFileInput = document.createElement('input');
newFileInput.type = 'file';
newFileInput.multiple = true;
newFileInput.name = 'fileInput';
const uploadfiles = this.uploadFiles.bind(this);
newFileInput.onchange = uploadfiles;
oldFileInput.parentNode.replaceChild(newFileInput, oldFileInput);
}
private uploadFiles() {
this.onUploadStarted.emit();
const fileInputParentNative = this.fileInputParent.nativeElement;
const fileInput = fileInputParentNative.querySelector('input');
if (fileInput.files && fileInput.files.length > 0) {
const formData = new FormData();
for (let i = 0; i < fileInput.files.length; i++) {
formData.append('files', fileInput.files[i]);
}
const onUploaded = this.onUploaded;
const onError = this.onError;
const addFileInput = this.addFileInput.bind(this);
fetch('/api/Data/UploadFiles', {
credentials: 'include',
method: 'POST',
body: formData,
}).then((response: any) => {
if (response.status !== 200) {
const error = `An error occured. Status: ${response.status}`;
throw new Error(error);
}
return response.json();
}).then(files => {
onUploaded.emit(files);
addFileInput();
}).catch((error) => {
onError.emit(error);
});
}
Antwoord 8
Dit is handige tutorial , hoe Upload bestand met behulp van de NG2-bestand-upload en zonder NG2-FILE-UPLOAD.
Voor mij helpt het veel.
Op dit moment bevat tutorial een paar fouten:
1- Client moet dezelfde upload-URL als een server hebben,
Dus in app.component.ts
Lijn wijzigen
const URL = 'http://localhost:8000/api/upload';
Naar
const URL = 'http://localhost:3000';
2- Server Stuur respons als ‘Tekst / HTML’, dus in app.component.ts
Wijzigen
.post(URL, formData).map((res:Response) => res.json()).subscribe(
//map the success function and alert the response
(success) => {
alert(success._body);
},
(error) => alert(error))
Naar
.post(URL, formData)
.subscribe((success) => alert('success'), (error) => alert(error));
Antwoord 9
om afbeelding te uploaden met formuliervelden
SaveFileWithData(article: ArticleModel,picture:File): Observable<ArticleModel>
{
let headers = new Headers();
// headers.append('Content-Type', 'multipart/form-data');
// headers.append('Accept', 'application/json');
let requestoptions = new RequestOptions({
method: RequestMethod.Post,
headers:headers
});
let formData: FormData = new FormData();
if (picture != null || picture != undefined) {
formData.append('files', picture, picture.name);
}
formData.append("article",JSON.stringify(article));
return this.http.post("url",formData,requestoptions)
.map((response: Response) => response.json() as ArticleModel);
}
In mijn geval had ik .NET Web Api nodig in C#
// POST: api/Articles
[ResponseType(typeof(Article))]
public async Task<IHttpActionResult> PostArticle()
{
Article article = null;
try
{
HttpPostedFile postedFile = null;
var httpRequest = HttpContext.Current.Request;
if (httpRequest.Files.Count == 1)
{
postedFile = httpRequest.Files[0];
var filePath = HttpContext.Current.Server.MapPath("~/" + postedFile.FileName);
postedFile.SaveAs(filePath);
}
var json = httpRequest.Form["article"];
article = JsonConvert.DeserializeObject <Article>(json);
if (!ModelState.IsValid)
{
return BadRequest(ModelState);
}
article.CreatedDate = DateTime.Now;
article.CreatedBy = "Abbas";
db.articles.Add(article);
await db.SaveChangesAsync();
}
catch (Exception ex)
{
int a = 0;
}
return CreatedAtRoute("DefaultApi", new { id = article.Id }, article);
}
Antwoord 10
Vandaag werd ik ng2-file-upload-pakket geïntegreerd in mijn hoekige 6 applicatie, het was vrij eenvoudig, vind de onderstaande code op hoog niveau.
importeer de module ng2-file-upload
app.module.ts
import { FileUploadModule } from 'ng2-file-upload';
------
------
imports: [ FileUploadModule ],
------
------
Component ts bestandsimport FileUploader
app.component.ts
import { FileUploader, FileLikeObject } from 'ng2-file-upload';
------
------
const URL = 'http://localhost:3000/fileupload/';
------
------
public uploader: FileUploader = new FileUploader({
url: URL,
disableMultipart : false,
autoUpload: true,
method: 'post',
itemAlias: 'attachment'
});
public onFileSelected(event: EventEmitter<File[]>) {
const file: File = event[0];
console.log(file);
}
------
------
Component HTML bestandstag toevoegen
app.component.html
<input type="file" #fileInput ng2FileSelect [uploader]="uploader" (onFileSelected)="onFileSelected($event)" />
Online werken stackblitz-link:https://ng2-file -upload-voorbeeld.stackblitz.io
Voorbeeld van Stackblitz-code:https://stackblitz. com/edit/ng2-file-upload-example
Officiële documentatielink https://valor-software.com/ng2-file-upload /
Antwoord 11
Probeer de parameter options
niet in te stellen
this.http.post(${this.apiEndPoint}, formData)
en zorg ervoor dat u de globalHeaders
niet instelt in uw Http-fabriek.
Antwoord 12
In de eenvoudigste vorm werkt de volgende code in Angular 6/7
this.http.post("http://destinationurl.com/endpoint", fileFormData)
.subscribe(response => {
//handle response
}, err => {
//handle error
});
Hier is de volledige implementatie
Antwoord 13
jspdf en Angular 8
Ik genereer een pdf en wil de pdf uploaden met POST-verzoek, dit is hoe ik dat doe (voor de duidelijkheid, ik verwijder een deel van de code en de servicelaag)
import * as jsPDF from 'jspdf';
import { HttpClient } from '@angular/common/http';
constructor(private http: HttpClient)
upload() {
const pdf = new jsPDF()
const blob = pdf.output('blob')
const formData = new FormData()
formData.append('file', blob)
this.http.post('http://your-hostname/api/upload', formData).subscribe()
}
Antwoord 14
Ik heb een bestand geüpload met referentie. Er is geen pakket nodig om het bestand op deze manier te uploaden.
// code die in het .ts-bestand moet worden geschreven
@ViewChild("fileInput") fileInput;
addFile(): void {
let fi = this.fileInput.nativeElement;
if (fi.files && fi.files[0]) {
let fileToUpload = fi.files[0];
this.admin.addQuestionApi(fileToUpload)
.subscribe(
success => {
this.loading = false;
this.flashMessagesService.show('Uploaded successfully', {
classes: ['alert', 'alert-success'],
timeout: 1000,
});
},
error => {
this.loading = false;
if(error.statusCode==401) this.router.navigate(['']);
else
this.flashMessagesService.show(error.message, {
classes: ['alert', 'alert-danger'],
timeout: 1000,
});
});
}
}
// code die in het service.ts-bestand moet worden geschreven
addQuestionApi(fileToUpload: any){
var headers = this.getHeadersForMultipart();
let input = new FormData();
input.append("file", fileToUpload);
return this.http.post(this.baseUrl+'addQuestions', input, {headers:headers})
.map(response => response.json())
.catch(this.errorHandler);
}
// code die in html moet worden geschreven
<input type="file" #fileInput>