Angular File Upload

189

Ich bin Anfänger im Angular. Ich möchte wissen, wie man einen Angular 5- Datei-Upload-Teil erstellt . Ich versuche, ein Tutorial oder Dokument zu finden, sehe aber nirgendwo etwas. Irgendeine Idee dafür? Und ich versuche ng4-Dateien, aber es funktioniert nicht für Angular 5

core114
quelle
2
Choose FileAlso willst du Drag & Drop oder einfaches BTN-Upload? Bdw in beiden Fällen u einfach mit FormData
Dhyey
4
Schauen Sie sich primeng an, ich benutze es schon eine Weile und es funktioniert mit eckigem v5. primefaces.org/primeng/#/fileupload
Bunyamin Coskuner
Für diejenigen, die nur JSON auf den Client hochladen müssen, überprüfen Sie diese Frage: stackoverflow.com/questions/54971238/…
AnthonyW

Antworten:

419

Hier ist ein funktionierendes Beispiel für das Hochladen von Dateien auf die API:

Schritt 1: HTML-Vorlage (file-upload.component.html)

Definieren Sie ein einfaches Eingabe-Tag vom Typ file. Fügen Sie (change)-event eine Funktion für die Auswahl von Dateien hinzu.

<div class="form-group">
    <label for="file">Choose File</label>
    <input type="file"
           id="file"
           (change)="handleFileInput($event.target.files)">
</div>

Schritt 2: Upload-Behandlung in TypeScript (file-upload.component.ts)

Definieren Sie eine Standardvariable für die ausgewählte Datei.

fileToUpload: File = null;

Erstellen Sie eine Funktion, die Sie in (change)-event Ihres Dateieingabe-Tags verwenden:

handleFileInput(files: FileList) {
    this.fileToUpload = files.item(0);
}

Wenn Sie die Auswahl mehrerer Dateien durchführen möchten, können Sie dieses Dateiarray durchlaufen.

Erstellen Sie nun eine Datei-Upload-Funktion, indem Sie file-upload.service aufrufen:

uploadFileToActivity() {
    this.fileUploadService.postFile(this.fileToUpload).subscribe(data => {
      // do something, if upload success
      }, error => {
        console.log(error);
      });
  }

Schritt 3: Datei-Upload-Dienst (file-upload.service.ts)

Wenn Sie eine Datei über die POST-Methode hochladen, sollten Sie diese verwenden FormData, damit Sie der http-Anfrage eine Datei hinzufügen können.

postFile(fileToUpload: File): Observable<boolean> {
    const endpoint = 'your-destination-url';
    const formData: FormData = new FormData();
    formData.append('fileKey', fileToUpload, fileToUpload.name);
    return this.httpClient
      .post(endpoint, formData, { headers: yourHeadersConfig })
      .map(() => { return true; })
      .catch((e) => this.handleError(e));
}

Das ist also ein sehr einfaches Arbeitsbeispiel, das ich jeden Tag in meiner Arbeit verwende.

Gregor Doroschenko
quelle
6
@Katie hast du Polyfills aktiviert?
Gregor Doroschenko
2
@GregorDoroschenko Ich habe versucht, ein Modell mit zusätzlichen Informationen über die Datei zu verwenden, und ich musste dies tun, damit es funktioniert: const invFormData: FormData = new FormData(); invFormData.append('invoiceAttachment', invoiceAttachment, invoiceAttachment.name); invFormData.append('invoiceInfo', JSON.stringify(invoiceInfo)); Der Controller hat zwei entsprechende Parameter, aber ich musste den JSON im Controller analysieren. Mein Core 2-Controller würde das Modell im Parameter nicht automatisch erfassen. Mein ursprünglicher Entwurf war ein Modell mit einer Dateieigenschaft, aber ich konnte es nicht zum Laufen bringen
Papa Stahl
1
@ GregorDoroschenko Ich habe diesen Code createContrat(fileToUpload: File, newContrat: Contrat): Observable<boolean> { let headers = new Headers(); const endpoint = Api.getUrl(Api.URLS.createContrat)); const formData: FormData =new FormData(); formData.append('fileKey', fileToUpload, FileToUpload.name); let body newContrat.gup(this.auth.getCurrentUser().token); return this.http .post(endpoint, formData, body) .map(() => { return true; }) }
ausprobiert
1
@ GregorDoroschenko Und für mich funktioniert das nicht. Ich poste in ws:Content-Disposition: form-data; name="fileKey"; filename="file.docx" Content-Type: application/octet-stream <file>
OnnaB
1
@OnnaB Wenn Sie FormData für Dateien und andere Eigenschaften verwenden, sollten Sie Ihre Datei und andere Eigenschaften als FormData analysieren. Sie können FormData und body nicht gleichzeitig verwenden.
Gregor Doroschenko
22

Auf diese Weise implementiere ich eine Upload-Datei in die Web-API im Projekt.

Ich teile für wen Sorge.

const formData: FormData = new FormData();
formData.append('Image', image, image.name);
formData.append('ComponentId', componentId);
return this.http.post('/api/dashboard/UploadImage', formData);

Schritt für Schritt

ASP.NET-Web-API

[HttpPost]
[Route("api/dashboard/UploadImage")]
public HttpResponseMessage UploadImage() 
{
    string imageName = null;
    var httpRequest = HttpContext.Current.Request;
    //Upload Image
    var postedFile = httpRequest.Files["Image"];
    //Create custom filename
    if (postedFile != null)
    {
        imageName = new String(Path.GetFileNameWithoutExtension(postedFile.FileName).Take(10).ToArray()).Replace(" ", "-");
        imageName = imageName + DateTime.Now.ToString("yymmssfff") + Path.GetExtension(postedFile.FileName);
        var filePath = HttpContext.Current.Server.MapPath("~/Images/" + imageName);
        postedFile.SaveAs(filePath);
    }
}

HTML-Formular

<form #imageForm=ngForm (ngSubmit)="OnSubmit(Image)">

    <img [src]="imageUrl" class="imgArea">
    <div class="image-upload">
        <label for="file-input">
            <img src="upload.jpg" />
        </label>

        <input id="file-input" #Image type="file" (change)="handleFileInput($event.target.files)" />
        <button type="submit" class="btn-large btn-submit" [disabled]="Image.value=='' || !imageForm.valid"><i
                class="material-icons">save</i></button>
    </div>
</form>

TS-Datei zur Verwendung der API

OnSubmit(Image) {
    this.dashboardService.uploadImage(this.componentId, this.fileToUpload).subscribe(
      data => {
        console.log('done');
        Image.value = null;
        this.imageUrl = "/assets/img/logo.png";
      }
    );
  }

Service TS

uploadImage(componentId, image) {
        const formData: FormData = new FormData();
        formData.append('Image', image, image.name);
        formData.append('ComponentId', componentId);
        return this.http.post('/api/dashboard/UploadImage', formData);
    }
Hien Nguyen
quelle
1
Wie senden Sie keine Header?
Shalom Dahan
14

Eine sehr einfache und schnellste Methode ist das Hochladen von ng2-Dateien .

Installieren Sie ng2-file-upload über npm. npm i ng2-file-upload --save

Importieren Sie zunächst das Modul in Ihr Modul.

import { FileUploadModule } from 'ng2-file-upload';

Add it to [imports] under @NgModule:
imports: [ ... FileUploadModule, ... ]

Markup:

<input ng2FileSelect type="file" accept=".xml" [uploader]="uploader"/>

In Ihrer Komponente ts:

import { FileUploader } from 'ng2-file-upload';
...
uploader: FileUploader = new FileUploader({ url: "api/your_upload", removeAfterUpload: false, autoUpload: true });

Dies ist die einfachste Verwendung. Um alle Möglichkeiten zu kennen, siehe Demo

Trueboroda
quelle
4
Wie bekomme ich eine Antwort, wenn das Bild hochgeladen wurde? Was wird die Antwort sein, Dokumentation fehlt dieser Teil.
Muhammad Shahzad
7

Ich verwende Angular 5.2.11. Ich mag die von Gregor Doroschenko bereitgestellte Lösung. Ich habe jedoch festgestellt, dass die hochgeladene Datei keine Bytes enthält. Ich musste eine kleine Änderung vornehmen, damit sie für mich funktioniert.

postFile(fileToUpload: File): Observable<boolean> {
  const endpoint = 'your-destination-url';
  return this.httpClient
    .post(endpoint, fileToUpload, { headers: yourHeadersConfig })
    .map(() => { return true; })
    .catch((e) => this.handleError(e));
}

Die folgenden Zeilen (formData) haben bei mir nicht funktioniert.

const formData: FormData = new FormData();
formData.append('fileKey', fileToUpload, fileToUpload.name);

https://github.com/amitrke/ngrke/blob/master/src/app/services/fileupload.service.ts

Amit
quelle
6

Ok, da dieser Thread zu den ersten Ergebnissen von Google gehört und für andere Nutzer, die dieselbe Frage haben, müssen Sie das Rad nicht erneut aktivieren, wie von trueboroda angegeben. Es gibt die ng2-Datei-Upload-Bibliothek, die diesen Prozess des Hochladens von a vereinfacht Datei mit Winkel 6 und 7 alles, was Sie tun müssen, ist:

Installieren Sie die neueste Angular CLI

yarn add global @angular/cli

Installieren Sie dann rx-compatible, um Kompatibilitätsprobleme zu lösen

npm install rxjs-compat --save

Installieren Sie ng2-file-upload

npm install ng2-file-upload --save

Importieren Sie die FileSelectDirective-Direktive in Ihr Modul.

import { FileSelectDirective } from 'ng2-file-upload';

Add it to [declarations] under @NgModule:
declarations: [ ... FileSelectDirective , ... ]

In Ihrer Komponente

import { FileUploader } from 'ng2-file-upload/ng2-file-upload';
...

export class AppComponent implements OnInit {

   public uploader: FileUploader = new FileUploader({url: URL, itemAlias: 'photo'});
}

Vorlage

<input type="file" name="photo" ng2FileSelect [uploader]="uploader" />

Zum besseren Verständnis können Sie diesen Link überprüfen: So laden Sie eine Datei mit Angular 6/7 hoch

Mohamed Makkaoui
quelle
1
Danke für den Link. Das Hochladen funktioniert auf dem Desktop einwandfrei, aber ich kann für mein ganzes Leben keine Uploads für mobile Geräte wie iOS erhalten. Ich kann eine Datei aus der Kamerarolle auswählen, aber wenn ich sie hochlade, schlägt sie immer fehl. Irgendwelche Ideen? Zu Ihrer Information, dies wird in einer mobilen Safari ausgeführt, nicht in einer installierten App.
ScottN
1
Hallo @ScottN und Sie sind willkommen, vielleicht kommt das Problem von dem Browser, den Sie verwenden? hast du es mit einem anderen getestet?
Mohamed Makkaoui
1
Hallo @Mohamed Makkaoui, danke für die Antwort. Ich habe es in Chrome unter iOS versucht und immer noch das gleiche Ergebnis. Ich bin gespannt, ob dies beim Posten auf dem Server ein Header-Problem ist. Ich verwende eine benutzerdefinierte WebAPI, die in .Net und NICHT in AWS FYI geschrieben ist.
ScottN
1
Hallo @ScottN, wir werden nicht wissen können, ob es sich um ein Header-Problem handelt, bis Sie Ihren Code über diesen Link developer.google.com/web/tools/chrome-devtools/… debuggen und sehen, welche Fehlermeldung Sie erhalten.
Mohamed Makkaoui
6

Persönlich mache ich dies mit ngx-material-file-input für das Front-End und Firebase für das Back-End. Genauer gesagt C lauter Speicher für Firebase für das Back-End in Kombination mit Cloud Firestore. Unten ein Beispiel, das die Datei auf nicht mehr als 20 MB beschränkt und nur bestimmte Dateierweiterungen akzeptiert. Ich verwende Cloud Firestore auch zum Speichern von Links zu den hochgeladenen Dateien, aber Sie können dies überspringen.

contact.component.html

<mat-form-field>
  <!--
    Accept only files in the following format: .doc, .docx, .jpg, .jpeg, .pdf, .png, .xls, .xlsx. However, this is easy to bypass, Cloud Storage rules has been set up on the back-end side.
  -->
  <ngx-mat-file-input
    [accept]="[
      '.doc',
      '.docx',
      '.jpg',
      '.jpeg',
      '.pdf',
      '.png',
      '.xls',
      '.xlsx'
    ]"
    (change)="uploadFile($event)"
    formControlName="fileUploader"
    multiple
    aria-label="Here you can add additional files about your project, which can be helpeful for us."
    placeholder="Additional files"
    title="Additional files"
    type="file"
  >
  </ngx-mat-file-input>
  <mat-icon matSuffix>folder</mat-icon>
  <mat-hint
    >Accepted formats: DOC, DOCX, JPG, JPEG, PDF, PNG, XLS and XLSX,
    maximum files upload size: 20 MB.
  </mat-hint>
  <!--
    Non-null assertion operators are required to let know the compiler that this value is not empty and exists.
  -->
  <mat-error
    *ngIf="contactForm.get('fileUploader')!.hasError('maxContentSize')"
  >
    This size is too large,
    <strong
      >maximum acceptable upload size is
      {{
        contactForm.get('fileUploader')?.getError('maxContentSize')
          .maxSize | byteFormat
      }}</strong
    >
    (uploaded size:
    {{
      contactForm.get('fileUploader')?.getError('maxContentSize')
        .actualSize | byteFormat
    }}).
  </mat-error>
</mat-form-field>

contact.component.ts (Größenprüfteil)

import { FileValidator } from 'ngx-material-file-input';
import { FormBuilder, FormGroup, Validators } from '@angular/forms';

/**
 * @constructor
 * @description Creates a new instance of this component.
 * @param  {formBuilder} - an abstraction class object to create a form group control for the contact form.
 */
constructor(
  private angularFirestore: AngularFirestore,
  private angularFireStorage: AngularFireStorage,
  private formBuilder: FormBuilder
) {}

public maxFileSize = 20971520;
public contactForm: FormGroup = this.formBuilder.group({
    fileUploader: [
      '',
      Validators.compose([
        FileValidator.maxContentSize(this.maxFileSize),
        Validators.maxLength(512),
        Validators.minLength(2)
      ])
    ]
})

contact.component.ts (Datei-Uploader-Teil)

import { AngularFirestore } from '@angular/fire/firestore';
import {
  AngularFireStorage,
  AngularFireStorageReference,
  AngularFireUploadTask
} from '@angular/fire/storage';
import { catchError, finalize } from 'rxjs/operators';
import { throwError } from 'rxjs';

public downloadURL: string[] = [];
/**
* @description Upload additional files to Cloud Firestore and get URL to the files.
   * @param {event} - object of sent files.
   * @returns {void}
   */
  public uploadFile(event: any): void {
    // Iterate through all uploaded files.
    for (let i = 0; i < event.target.files.length; i++) {
      const randomId = Math.random()
        .toString(36)
        .substring(2); // Create random ID, so the same file names can be uploaded to Cloud Firestore.

      const file = event.target.files[i]; // Get each uploaded file.

      // Get file reference.
      const fileRef: AngularFireStorageReference = this.angularFireStorage.ref(
        randomId
      );

      // Create upload task.
      const task: AngularFireUploadTask = this.angularFireStorage.upload(
        randomId,
        file
      );

      // Upload file to Cloud Firestore.
      task
        .snapshotChanges()
        .pipe(
          finalize(() => {
            fileRef.getDownloadURL().subscribe((downloadURL: string) => {
              this.angularFirestore
                .collection(process.env.FIRESTORE_COLLECTION_FILES!) // Non-null assertion operator is required to let know the compiler that this value is not empty and exists.
                .add({ downloadURL: downloadURL });
              this.downloadURL.push(downloadURL);
            });
          }),
          catchError((error: any) => {
            return throwError(error);
          })
        )
        .subscribe();
    }
  }

Speicherregeln

rules_version = '2';
service firebase.storage {
  match /b/{bucket}/o {
    match /{allPaths=**} {
        allow read; // Required in order to send this as attachment.
      // Allow write files Firebase Storage, only if:
      // 1) File is no more than 20MB
      // 2) Content type is in one of the following formats: .doc, .docx, .jpg, .jpeg, .pdf, .png, .xls, .xlsx.
      allow write: if request.resource.size <= 20 * 1024 * 1024
        && (request.resource.contentType.matches('application/msword')
        || request.resource.contentType.matches('application/vnd.openxmlformats-officedocument.wordprocessingml.document')
        || request.resource.contentType.matches('image/jpg')
        || request.resource.contentType.matches('image/jpeg')
        || request.resource.contentType.matches('application/pdf')
                || request.resource.contentType.matches('image/png')
        || request.resource.contentType.matches('application/vnd.ms-excel')
        || request.resource.contentType.matches('application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'))
    }
  }
}
Daniel Danielecki
quelle
2
toString()Sieht gut aus , aber warum brauchen Sie bei der contactForm-Deklaration?
Trungk18
1
@ trungk18 überprüfe es noch einmal und du hast recht das toString()ist nutzlos, habe meine antwort bearbeitet. Für diejenigen , die diesen Kommentar, am Ende lesen würden fileUploaderin contact.component.ts hatte ich ])].toString()}). Jetzt ist es einfach : ])]}).
Daniel Danielecki
5
  1. HTML

    <div class="form-group">
      <label for="file">Choose File</label><br /> <input type="file" id="file" (change)="uploadFiles($event.target.files)">
    </div>

    <button type="button" (click)="RequestUpload()">Ok</button>
  1. ts Datei
public formData = new FormData();
ReqJson: any = {};

uploadFiles( file ) {
        console.log( 'file', file )
        for ( let i = 0; i < file.length; i++ ) {
            this.formData.append( "file", file[i], file[i]['name'] );
        }
    }

RequestUpload() {
        this.ReqJson["patientId"] = "12"
        this.ReqJson["requesterName"] = "test1"
        this.ReqJson["requestDate"] = "1/1/2019"
        this.ReqJson["location"] = "INDIA"
        this.formData.append( 'Info', JSON.stringify( this.ReqJson ) )
            this.http.post( '/Request', this.formData )
                .subscribe(( ) => {                 
                });     
    }
  1. Backend Spring (Java-Datei)

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;

@Controller
public class Request {
    private static String UPLOADED_FOLDER = "c://temp//";

    @PostMapping("/Request")
    @ResponseBody
    public String uploadFile(@RequestParam("file") MultipartFile file, @RequestParam("Info") String Info) {
        System.out.println("Json is" + Info);
        if (file.isEmpty()) {
            return "No file attached";
        }
        try {
            // Get the file and save it somewhere
            byte[] bytes = file.getBytes();
            Path path = Paths.get(UPLOADED_FOLDER + file.getOriginalFilename());
            Files.write(path, bytes);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return "Succuss";
    }
}

Wir müssen einen Ordner "temp" im Laufwerk C erstellen, dann druckt dieser Code den Json in der Konsole und speichert die hochgeladene Datei im erstellten Ordner

Shafeeq Mohammed
quelle
Wie rufen wir diese Datei ab? Haben Sie eine Anleitung dazu?
Siddharth Choudhary
Auch mein Spring Server läuft auf 8080 und Angular's läuft auf 3000. Wenn ich jetzt server_url als localhost markiere: 8080 / api / uploadForm heißt es, dass cors nicht erlaubt sind!
Siddharth Choudhary
byte [] bytes = file.getBytes (); Es wird den Byte-Stream geben. Sie können ihn in eine Datei konvertieren. Bei einem Cors-Problem finden Sie eine Lösung in Google
Shafeeq Mohammed,
5

Zunächst müssen Sie HttpClient in Ihrem Angular-Projekt einrichten.

Öffnen Sie die Datei src / app / app.module.ts, importieren Sie HttpClientModule und fügen Sie sie wie folgt zum Import-Array des Moduls hinzu:

import { BrowserModule } from '@angular/platform-browser';  
import { NgModule } from '@angular/core';
import { AppRoutingModule } from './app-routing.module';  
import { AppComponent } from './app.component';  
import { HttpClientModule } from '@angular/common/http';

@NgModule({  
  declarations: [  
    AppComponent,  
  ],  
  imports: [  
    BrowserModule,  
    AppRoutingModule,  
    HttpClientModule  
  ],  
  providers: [],  
  bootstrap: [AppComponent]  
})  
export class AppModule { }

Generieren Sie als Nächstes eine Komponente:

$ ng generate component home

Generieren Sie als Nächstes einen Upload-Service:

$ ng generate service upload

Öffnen Sie als Nächstes die Datei src / app / upload.service.ts wie folgt:

import { HttpClient, HttpEvent, HttpErrorResponse, HttpEventType } from  '@angular/common/http';  
import { map } from  'rxjs/operators';

@Injectable({  
  providedIn: 'root'  
})  
export class UploadService { 
    SERVER_URL: string = "https://file.io/";  
    constructor(private httpClient: HttpClient) { }
    public upload(formData) {

      return this.httpClient.post<any>(this.SERVER_URL, formData, {  
         reportProgress: true,  
         observe: 'events'  
      });  
   }
}

Öffnen Sie als Nächstes die Datei src / app / home / home.component.ts und fügen Sie zunächst die folgenden Importe hinzu:

import { Component, OnInit, ViewChild, ElementRef  } from '@angular/core';
import { HttpEventType, HttpErrorResponse } from '@angular/common/http';
import { of } from 'rxjs';  
import { catchError, map } from 'rxjs/operators';  
import { UploadService } from  '../upload.service';

Definieren Sie als Nächstes die Variablen fileUpload und files und fügen Sie UploadService wie folgt ein:

@Component({  
  selector: 'app-home',  
  templateUrl: './home.component.html',  
  styleUrls: ['./home.component.css']  
})  
export class HomeComponent implements OnInit {
    @ViewChild("fileUpload", {static: false}) fileUpload: ElementRef;files  = [];  
    constructor(private uploadService: UploadService) { }

Definieren Sie als Nächstes die Methode uploadFile ():

uploadFile(file) {  
    const formData = new FormData();  
    formData.append('file', file.data);  
    file.inProgress = true;  
    this.uploadService.upload(formData).pipe(  
      map(event => {  
        switch (event.type) {  
          case HttpEventType.UploadProgress:  
            file.progress = Math.round(event.loaded * 100 / event.total);  
            break;  
          case HttpEventType.Response:  
            return event;  
        }  
      }),  
      catchError((error: HttpErrorResponse) => {  
        file.inProgress = false;  
        return of(`${file.data.name} upload failed.`);  
      })).subscribe((event: any) => {  
        if (typeof (event) === 'object') {  
          console.log(event.body);  
        }  
      });  
  }

Definieren Sie als Nächstes die Methode uploadFiles (), mit der mehrere Bilddateien hochgeladen werden können:

private uploadFiles() {  
    this.fileUpload.nativeElement.value = '';  
    this.files.forEach(file => {  
      this.uploadFile(file);  
    });  
}

Definieren Sie als Nächstes die onClick () -Methode:

onClick() {  
    const fileUpload = this.fileUpload.nativeElement;fileUpload.onchange = () => {  
    for (let index = 0; index < fileUpload.files.length; index++)  
    {  
     const file = fileUpload.files[index];  
     this.files.push({ data: file, inProgress: false, progress: 0});  
    }  
      this.uploadFiles();  
    };  
    fileUpload.click();  
}

Als Nächstes müssen wir die HTML-Vorlage unserer Benutzeroberfläche zum Hochladen von Bildern erstellen. Öffnen Sie die Datei src / app / home / home.component.html und fügen Sie den folgenden Inhalt hinzu:

       <div style="text-align:center; margin-top: 100px; ">

        <button mat-button color="warn" (click)="onClick()">  
            Upload  
        </button>  
    <input type="file" #fileUpload id="fileUpload" name="fileUpload" multiple="multiple" accept="image/*" style="display:none;" /></div>

Schauen Sie sich dieses Tutorial und diesen Beitrag an

Ahmed Bouchefra
quelle
4

Vollständiges Beispiel für das Hochladen von Dateien mit Angular und NodeJS (Express)

HTML Quelltext

            <div class="form-group">
                <label for="file">Choose File</label><br/>
                <input type="file" id="file" (change)="uploadFile($event.target.files)" multiple>
            </div>

TS-Komponentencode

uploadFile(files) {
    console.log('files', files)
        var formData = new FormData();

    for(let i =0; i < files.length; i++){
      formData.append("files", files[i], files[i]['name']);
        }

    this.httpService.httpPost('/fileUpload', formData)
      .subscribe((response) => {
        console.log('response', response)
      },
        (error) => {
      console.log('error in fileupload', error)
       })
  }

Knoten Js Code

fileUpload API-Controller

function start(req, res) {
fileUploadService.fileUpload(req, res)
    .then(fileUploadServiceResponse => {
        res.status(200).send(fileUploadServiceResponse)
    })
    .catch(error => {
        res.status(400).send(error)
    })
}

module.exports.start = start

Hochladen des Dienstes mit multer

const multer = require('multer') // import library
const moment = require('moment')
const q = require('q')
const _ = require('underscore')
const fs = require('fs')
const dir = './public'

/** Store file on local folder */
let storage = multer.diskStorage({
destination: function (req, file, cb) {
    cb(null, 'public')
},
filename: function (req, file, cb) {
    let date = moment(moment.now()).format('YYYYMMDDHHMMSS')
    cb(null, date + '_' + file.originalname.replace(/-/g, '_').replace(/ /g,     '_'))
}
})

/** Upload files  */
let upload = multer({ storage: storage }).array('files')

/** Exports fileUpload function */
module.exports = {
fileUpload: function (req, res) {
    let deferred = q.defer()

    /** Create dir if not exist */
    if (!fs.existsSync(dir)) {
        fs.mkdirSync(dir)
        console.log(`\n\n ${dir} dose not exist, hence created \n\n`)
    }

    upload(req, res, function (err) {
        if (req && (_.isEmpty(req.files))) {
            deferred.resolve({ status: 200, message: 'File not attached', data: [] })
        } else {
            if (err) {
                deferred.reject({ status: 400, message: 'error', data: err })
            } else {
                deferred.resolve({
                    status: 200,
                    message: 'File attached',
                    filename: _.pluck(req.files,
                        'filename'),
                    data: req.files
                })
            }
        }
    })
    return deferred.promise
}
}
Rohit Parte
quelle
1
Woher kommt httpService?
James
@James httpService ist ein http-Modul von Angular, mit dem http an den Server aufgerufen werden kann. Sie können jeden gewünschten http-Dienst verwenden. Importieren Sie {HttpClientModule} von '@ angle / common / http';
Rohit Parte
2

Versuche dies

Installieren

npm install primeng --save

Importieren

import {FileUploadModule} from 'primeng/primeng';

Html

<p-fileUpload name="myfile[]" url="./upload.php" multiple="multiple"
    accept="image/*" auto="auto"></p-fileUpload>
Vignesh
quelle
1
Ich bin müde mit dem obigen Beispiel. Aber ich bekomme ./upload.php nicht gefunden.
Sandeep Kamath
2
Sie sollten Ihre URL zur Verfügung stellen , wo es statt upload.php @sandeep kamath geladen werden sollen
Vignesh
1
@ Vignesh danke für deine Antwort. Aber ich fand, dass ich das URL-Attribut überhaupt nicht gebe, es lädt die Datei, sollte das Standardattribut sein.
Sandeep Kamath
1
Können Sie bitte erklären, wie wir die Datei in PHP erhalten können, wenn wir dies tun?
Shaikh Arbaaz
2

In Angular 7/8/9

Quelle Link -

Geben Sie hier die Bildbeschreibung ein

Verwenden des Bootstrap-Formulars

<form>
    <div class="form-group">
        <fieldset class="form-group">

            <label>Upload Logo</label>
            {{imageError}}
            <div class="custom-file fileInputProfileWrap">
                <input type="file" (change)="fileChangeEvent($event)" class="fileInputProfile">
                <div class="img-space">

                    <ng-container *ngIf="isImageSaved; else elseTemplate">
                        <img [src]="cardImageBase64" />
                    </ng-container>
                    <ng-template #elseTemplate>

                        <img src="./../../assets/placeholder.png" class="img-responsive">
                    </ng-template>

                </div>

            </div>
        </fieldset>
    </div>
    <a class="btn btn-danger" (click)="removeImage()" *ngIf="isImageSaved">Remove</a>
</form>

In der Komponentenklasse

fileChangeEvent(fileInput: any) {
    this.imageError = null;
    if (fileInput.target.files && fileInput.target.files[0]) {
        // Size Filter Bytes
        const max_size = 20971520;
        const allowed_types = ['image/png', 'image/jpeg'];
        const max_height = 15200;
        const max_width = 25600;

        if (fileInput.target.files[0].size > max_size) {
            this.imageError =
                'Maximum size allowed is ' + max_size / 1000 + 'Mb';

            return false;
        }

        if (!_.includes(allowed_types, fileInput.target.files[0].type)) {
            this.imageError = 'Only Images are allowed ( JPG | PNG )';
            return false;
        }
        const reader = new FileReader();
        reader.onload = (e: any) => {
            const image = new Image();
            image.src = e.target.result;
            image.onload = rs => {
                const img_height = rs.currentTarget['height'];
                const img_width = rs.currentTarget['width'];

                console.log(img_height, img_width);


                if (img_height > max_height && img_width > max_width) {
                    this.imageError =
                        'Maximum dimentions allowed ' +
                        max_height +
                        '*' +
                        max_width +
                        'px';
                    return false;
                } else {
                    const imgBase64Path = e.target.result;
                    this.cardImageBase64 = imgBase64Path;
                    this.isImageSaved = true;
                    // this.previewImagePath = imgBase64Path;
                }
            };
        };

        reader.readAsDataURL(fileInput.target.files[0]);
    }
}

removeImage() {
    this.cardImageBase64 = null;
    this.isImageSaved = false;
}
Code Spy
quelle