Unggah File Angular


193

Saya seorang pemula dengan Angular, saya ingin tahu cara membuat bagian unggah File 5 Angular , saya mencoba menemukan tutorial atau dokumen, tetapi saya tidak melihat apa pun di mana pun. Ada ide untuk ini? Dan saya mencoba ng4-file tetapi tidak berfungsi untuk Angular 5


2
jadi apakah kamu mau drag and drop atau Choose Fileupload btn sederhana ? Bdw dalam kedua kasus Anda cukup mengunggah menggunakan FormData
Dhyey

4
Lihatlah primeng, saya telah menggunakannya untuk sementara waktu dan ia bekerja dengan v5 sudut. primefaces.org/primeng/#/fileupload
Bunyamin Coskuner

Bagi mereka yang hanya perlu mengunggah JSON ke klien, lihat pertanyaan ini: stackoverflow.com/questions/54971238/…
AnthonyW

Jawaban:


427

Berikut adalah contoh kerja untuk unggahan file ke api:

Langkah 1: Template HTML (file-upload.component.html)

Tentukan tag input tipe sederhana file. Tambahkan fungsi ke (change)-event untuk menangani pemilihan file.

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

Langkah 2: Unggah Penanganan dalam TypeScript (file-upload.component.ts)

Tentukan variabel default untuk file yang dipilih.

fileToUpload: File = null;

Buat fungsi yang Anda gunakan di (change)-bahkan dari tag input file Anda:

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

Jika Anda ingin menangani pemilihan multi, maka Anda dapat mengulangi melalui array file ini.

Sekarang buat fungsi unggah file dengan memanggil Anda file-upload.layanan:

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

Langkah 3: Layanan Unggah File (file-upload.service.ts)

Dengan mengunggah file melalui POST-metode yang harus Anda gunakan FormData, karena Anda dapat menambahkan file ke permintaan http.

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));
}

Jadi, Ini adalah contoh kerja yang sangat sederhana, yang saya gunakan setiap hari dalam pekerjaan saya.


6
@ Katie, sudahkah Anda mengaktifkan polyfill?
Gregor Doroschenko

2
@ GrregorDoroschenko Saya mencoba menggunakan model dengan informasi tambahan tentang file dan saya harus melakukan ini untuk membuatnya berfungsi: const invFormData: FormData = new FormData(); invFormData.append('invoiceAttachment', invoiceAttachment, invoiceAttachment.name); invFormData.append('invoiceInfo', JSON.stringify(invoiceInfo)); Pengontrol memiliki dua parameter yang sesuai, tetapi saya harus mengurai JSON di controller. Pengontrol Core 2 saya tidak akan secara otomatis mengambil model dalam parameter. Desain asli saya adalah model dengan properti file, tapi saya tidak bisa membuatnya bekerja
Papa Stahl

1
@ GrregorDoroschenko Saya mencoba kode inicreateContrat(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; }) }
OnnaB

1
@ GregorDoroschenko Dan bagi saya tidak bekerja. Saya memposting di ws:Content-Disposition: form-data; name="fileKey"; filename="file.docx" Content-Type: application/octet-stream <file>
OnnaB

1
@OnnaB Jika Anda menggunakan FormData untuk file dan properti lainnya, maka Anda harus mengurai file dan properti lainnya sebagai FormData. Anda tidak bisa menggunakan FormData dan tubuh secara bersamaan.
Gregor Doroschenko

23

Dengan cara ini saya menerapkan file unggah ke API web dalam proyek.

Saya berbagi untuk siapa perhatian.

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

Selangkah demi selangkah

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);
    }
}

Bentuk HTML

<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>

File TS untuk menggunakan API

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

Layanan 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);
    }

1
Apa cara Anda untuk tidak mengirim tajuk?
Shalom Dahan

14

Metode yang sangat mudah dan tercepat menggunakan ng2-file-upload .

Instal ng2-file-upload via npm. npm i ng2-file-upload --save

Pada modul impor pertama di modul Anda.

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

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

Markup:

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

Di ts commonen Anda:

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

Ini adalah penggunaan paling sederhana dari ini. Untuk mengetahui semua kekuatan ini, lihat demo


4
bagaimana mendapatkan respons saat gambar diunggah? apa yang akan menjadi respons, dokumentasi tidak ada bagian ini.
Muhammad Shahzad

7

Saya menggunakan Angular 5.2.11, saya suka solusi yang disediakan oleh Gregor Doroschenko, namun saya perhatikan bahwa file yang diunggah adalah nol byte, saya harus membuat perubahan kecil untuk membuatnya bekerja untuk saya.

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));
}

Baris berikut (formData) tidak berfungsi untuk saya.

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

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


6

Ok, karena utas ini muncul di antara hasil pertama google dan untuk pengguna lain yang memiliki pertanyaan yang sama, Anda tidak perlu mengaktifkan kembali roda seperti yang ditunjukkan oleh trueboroda ada perpustakaan ng2-file-upload yang menyederhanakan proses mengunggah sebuah file dengan sudut 6 dan 7 yang perlu Anda lakukan adalah:

Instal Angular CLI terbaru

yarn add global @angular/cli

Kemudian instal rx-compat untuk masalah kompatibilitas

npm install rxjs-compat --save

Instal ng2-file-upload

npm install ng2-file-upload --save

Impor FileSelectDirective Directive dalam modul Anda.

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

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

Di komponen Anda

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

export class AppComponent implements OnInit {

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

Templat

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

Untuk pemahaman yang lebih baik Anda dapat memeriksa tautan ini: Cara Mengunggah File Dengan Angular 6/7


1
Terima kasih untuk tautannya. Mengunggah berfungsi dengan baik di desktop tetapi saya tidak bisa seumur hidup membuat unggahan bekerja di perangkat seluler seperti iOS. Saya dapat memilih file dari rol kamera tetapi ketika saya mengunggahnya selalu gagal. Ada ide? FYI, menjalankan ini di safari seluler, bukan di aplikasi yang diinstal.
ScottN

1
Hai @ScottN dan Anda dipersilakan, mungkin masalahnya berasal dari browser yang Anda gunakan? Apakah Anda mengujinya dengan yang lain?
Mohamed Makkaoui

1
Hai @Mohamed Makkaoui terima kasih atas jawabannya. Saya sudah mencobanya di Chrome di iOS dan hasilnya masih sama. Saya ingin tahu apakah ini masalah header saat memposting ke server? Saya menggunakan WebAPI khusus yang ditulis dengan .Net dan NOT AWS FYI.
ScottN

1
Hai @ScottN, kami tidak akan dapat mengetahui apakah ini masalah header hingga Anda men-debug kode Anda menggunakan tautan ini developers.google.com/web/tools/chrome-devtools/… dan melihat pesan kesalahan apa yang Anda dapatkan.
Mohamed Makkaoui

6

Secara pribadi saya melakukan ini menggunakan ngx-material-file-input untuk front-end, dan Firebase untuk back-end. Lebih tepatnya Penyimpanan C keras untuk Firebase untuk back-end yang dikombinasikan dengan Cloud Firestore. Di bawah contoh, yang membatasi file tidak lebih dari 20 MB, dan hanya menerima ekstensi file tertentu. Saya juga menggunakan Cloud Firestore untuk menyimpan tautan ke file yang diunggah, tetapi Anda dapat melewati ini.

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 (bagian validator ukuran)

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 (bagian pengunggah file)

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();
    }
  }

aturan penyimpanan

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'))
    }
  }
}

2
Terlihat hebat, tetapi mengapa Anda perlu toString()di deklarasi contactForm?
trungk18

1
@ trungk18 periksa sekali lagi, dan Anda benar toString()itu tidak berguna, edit jawaban saya. Bagi mereka yang akan membaca komentar ini, pada akhir fileUploaderdi contact.component.ts aku punya ])].toString()}). Sekarang itu hanya: ])]}).
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. File ts
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 (file java)

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";
    }
}

Kita harus membuat folder "temp" di drive C, maka kode ini akan mencetak Json in console dan menyimpan file yang diunggah di folder yang dibuat


Bagaimana cara kita mengambil file itu? Apakah Anda memiliki panduan tentang hal itu?
Siddharth Choudhary

Juga server pegas saya berjalan pada 8080 dan sudut berjalan pada 3000. Sekarang ketika saya menandai server_url sebagai localhost: 8080 / api / uploadForm ia mengatakan bahwa kors tidak diperbolehkan!
Siddharth Choudhary

byte [] byte = file.getBytes (); itu akan memberikan aliran byte .. Anda dapat mengubahnya menjadi file, untuk masalah kors Anda dapat menemukan solusi di google
Shafeeq Mohammed

5

Pertama, Anda perlu mengatur HttpClient di proyek Angular Anda.

Buka file src / app / app.module.ts, impor HttpClientModule dan tambahkan ke array impor modul sebagai berikut:

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 { }

Selanjutnya, hasilkan komponen:

$ ng generate component home

Selanjutnya, hasilkan layanan unggahan:

$ ng generate service upload

Selanjutnya, buka file src / app / upload.service.ts sebagai berikut:

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'  
      });  
   }
}

Selanjutnya, buka file src / app / home / home.component.ts, dan mulai dengan menambahkan impor berikut:

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';

Selanjutnya, tentukan fileUpload dan variabel file dan masukkan UploadService sebagai berikut:

@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) { }

Selanjutnya, tentukan metode 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);  
        }  
      });  
  }

Selanjutnya, tentukan metode uploadFiles () yang dapat digunakan untuk mengunggah banyak file gambar:

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

Selanjutnya, tentukan metode onClick ():

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();  
}

Selanjutnya, kita perlu membuat template HTML UI unggah gambar kita. Buka file src / app / home / home.component.html dan tambahkan konten berikut:

       <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>

Lihatlah tutorial ini dan postingan ini


4

Contoh lengkap pengunggahan File menggunakan Angular dan nodejs (express)

Kode HTML

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

Kode Komponen TS

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)
       })
  }

Kode Node Js

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

Unggah layanan menggunakan 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
}
}

1
dari mana httpService berasal?
James

@James httpService adalah modul http angular untuk melakukan panggilan http ke server. Anda dapat menggunakan layanan http apa pun yang Anda inginkan. Impor {HttpClientModule} dari '@ angular / common / http';
Rohit Parte

2

Coba ini

Install

npm install primeng --save

Impor

import {FileUploadModule} from 'primeng/primeng';

Html

<p-fileUpload name="myfile[]" url="./upload.php" multiple="multiple"
    accept="image/*" auto="auto"></p-fileUpload>

1
Saya lelah menggunakan contoh di atas. Tetapi saya mendapatkan ./upload.php tidak ditemukan.
Sandeep Kamath

2
Anda harus memberikan URL Anda di tempat ia seharusnya dimuat alih-alih upload.php @sandeep kamath
Vignesh

1
@ Vignesh terima kasih atas balasan Anda. Tetapi saya menemukan bahwa saya tidak memberikan atribut url sama sekali memuat file, harus menjadi yang default.
Sandeep Kamath

1
Bisakah Anda jelaskan bagaimana kami dapat menerima file dalam php jika kami melakukannya dengan metode ini.
Shaikh Arbaaz

2

Dalam Angular 7/8/9

Tautan Sumber

masukkan deskripsi gambar di sini

Menggunakan Formulir Bootstrap

<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>

Di Kelas Komponen

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;
}
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.