อัพโหลดไฟล์เชิงมุม


193

ฉันเป็นผู้เริ่มต้นกับ Angular ฉันต้องการทราบวิธีการสร้างส่วนการอัปโหลดไฟล์ Angular 5 ฉันพยายามหาบทช่วยสอนหรือเอกสาร แต่ฉันไม่เห็นอะไรเลย ความคิดใด ๆ สำหรับเรื่องนี้? และฉันลองใช้ไฟล์ ng4แต่ไม่สามารถใช้กับ Angular 5 ได้


2
คุณต้องการลากแล้วปล่อยหรือChoose Fileอัปโหลด btn ง่ายๆหรือไม่? Bdw ในทั้งสองกรณีคุณเพียงอัปโหลดโดยใช้FormData
Dhyey

4
ลองดูที่ primeng ฉันใช้มันมาระยะหนึ่งแล้วและใช้งานได้กับ angular v5 primefaces.org/primeng/#/fileupload
Bunyamin Coskuner

สำหรับผู้ที่ต้องการอัปโหลด JSON ไปยังไคลเอนต์ให้ตรวจสอบคำถามนี้: stackoverflow.com/questions/54971238/…
AnthonyW

คำตอบ:


427

นี่คือตัวอย่างที่ใช้งานได้สำหรับการอัปโหลดไฟล์ไปยัง api:

ขั้นตอนที่ 1: เทมเพลต HTML (file-upload.component.html)

กำหนดแท็กประเภทfileอย่างง่าย เพิ่มฟังก์ชั่น - (change)กิจกรรมสำหรับจัดการการเลือกไฟล์

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

ขั้นตอนที่ 2: การจัดการการอัปโหลดใน TypeScript (file-upload.component.ts)

กำหนดตัวแปรเริ่มต้นสำหรับไฟล์ที่เลือก

fileToUpload: File = null;

สร้างฟังก์ชั่นที่คุณใช้ใน - (change)กิจกรรมของแท็กอินพุตไฟล์ของคุณ:

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

หากคุณต้องการจัดการกับการเลือกหลายไฟล์คุณสามารถวนซ้ำผ่านอาร์เรย์ไฟล์นี้

ตอนนี้สร้างฟังก์ชั่นอัพโหลดไฟล์โดยโทรหาคุณ file-upload.service:

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

ขั้นตอนที่ 3: บริการอัพโหลดไฟล์ (file-upload.service.ts)

โดยการอัปโหลดไฟล์ผ่านวิธี POST คุณควรใช้FormDataเพราะเพื่อให้คุณสามารถเพิ่มไฟล์ในคำขอ 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));
}

นี่เป็นตัวอย่างการทำงานที่ง่ายมากซึ่งฉันใช้ทุกวันในการทำงาน


6
@ Katie เปิดใช้งาน polyfills แล้วหรือยัง
Gregor Doroschenko

2
@ GregorDoroschenko ฉันพยายามใช้แบบจำลองที่มีข้อมูลเพิ่มเติมเกี่ยวกับไฟล์และฉันต้องทำสิ่งนี้เพื่อให้มันทำงาน: const invFormData: FormData = new FormData(); invFormData.append('invoiceAttachment', invoiceAttachment, invoiceAttachment.name); invFormData.append('invoiceInfo', JSON.stringify(invoiceInfo)); คอนโทรลเลอร์มีพารามิเตอร์สองตัวที่สอดคล้องกัน แต่ฉันต้องแยก JSON ในคอนโทรลเลอร์ ตัวควบคุม Core 2 ของฉันจะไม่ดึงตัวแบบในพารามิเตอร์โดยอัตโนมัติ การออกแบบดั้งเดิมของฉันคือแบบจำลองที่มีคุณสมบัติไฟล์ แต่ฉันไม่สามารถทำงานได้
Papa Stahl

1
@GregorDoroschenko ฉันลองรหัสนี้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; }) }
OnnaB

1
@ GregorDoroschenko และสำหรับฉันไม่ทำงาน ฉันโพสต์ใน ws:Content-Disposition: form-data; name="fileKey"; filename="file.docx" Content-Type: application/octet-stream <file>
OnnaB

1
@OnnaB หากคุณใช้ FormData สำหรับไฟล์และคุณสมบัติอื่น ๆ คุณควรแยกไฟล์และคุณสมบัติอื่น ๆ เป็น FormData คุณไม่สามารถใช้ FormData และเนื้อความในเวลาเดียวกัน
Gregor Doroschenko

23

วิธีนี้ฉันจะใช้ไฟล์อัปโหลดกับเว็บ API ในโครงการ

ฉันแบ่งปันสำหรับผู้ที่กังวล

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

เป็นขั้นเป็นตอน

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

<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 ที่จะใช้ API

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

บริการ 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
ทางของคุณไม่ส่งหัวอะไร
ชะโลม Dahan

14

ที่ง่ายและวิธีที่เร็วที่สุดคือการใช้NG2 ไฟล์อัปโหลด

ติดตั้ง ng2-file-upload ผ่านทาง npm npm i ng2-file-upload --save

เมื่อโมดูลนำเข้าครั้งแรกในโมดูลของคุณ

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

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

มาร์กอัป:

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

ใน ts commponent ของคุณ:

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

มันคือการใช้งานที่ง่ายที่สุดของสิ่งนี้ หากต้องการทราบพลังทั้งหมดของการสาธิตนี้


4
จะรับการตอบสนองอย่างไรเมื่ออัพโหลดภาพ? สิ่งที่จะได้รับการตอบสนองเอกสารขาดหายไปในส่วนนี้
มูฮัมหมัดชาห์ซาด

7

ฉันใช้ Angular 5.2.11 ฉันชอบวิธีการแก้ปัญหาที่จัดทำโดย Gregor Doroschenko แต่ฉันสังเกตเห็นว่าไฟล์ที่อัปโหลดมีขนาดเป็นศูนย์ไบต์ฉันต้องทำการเปลี่ยนแปลงเล็กน้อยเพื่อให้ทำงานได้สำหรับฉัน

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

บรรทัดต่อไปนี้ (formData) ใช้งานไม่ได้สำหรับฉัน

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

ตกลงเนื่องจากเธรดนี้ปรากฏในผลลัพธ์แรกของ google และสำหรับผู้ใช้รายอื่นที่มีคำถามเดียวกันคุณไม่จำเป็นต้องหมุนวงล้อดังที่ Trueboroda ชี้ไปที่นั่นมีไลบรารี ng2-file-upload ซึ่งทำให้กระบวนการอัปโหลดนี้ง่ายขึ้น ไฟล์ที่มีมุม 6 และ 7 ที่คุณต้องทำคือ:

ติดตั้ง Angular CLI ล่าสุด

yarn add global @angular/cli

จากนั้นติดตั้ง rx-compat เพื่อดูความเข้ากันได้

npm install rxjs-compat --save

ติดตั้ง ng2-file-upload

npm install ng2-file-upload --save

นำเข้า FileSelectDirective Directive ในโมดูลของคุณ

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

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

ในองค์ประกอบของคุณ

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

export class AppComponent implements OnInit {

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

แบบ

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

เพื่อความเข้าใจที่ดีขึ้นคุณสามารถตรวจสอบลิงค์นี้: วิธีอัปโหลดไฟล์ด้วย Angular 6/7


1
ขอบคุณสำหรับลิงค์ การอัปโหลดใช้งานได้ดีบนเดสก์ท็อป แต่ฉันไม่สามารถใช้งานอุปกรณ์อัปโหลดบนอุปกรณ์พกพาเช่น iOS ฉันสามารถเลือกไฟล์จากม้วนฟิล์ม แต่เมื่อฉันอัปโหลดมันจะล้มเหลวเสมอ ความคิดใด ๆ FYI ใช้งานได้ในซาฟารีสำหรับมือถือไม่ใช่ในแอปที่ติดตั้ง
ScottN

1
สวัสดี @ScottN และยินดีต้อนรับคุณปัญหาอาจมาจากเบราว์เซอร์ที่คุณใช้อยู่หรือไม่? คุณทดสอบกับอีกอันไหม
Mohamed Makkaoui

1
สวัสดี @Mohamed Makkaoui ขอบคุณสำหรับการตอบกลับ ฉันลองใน Chrome บน iOS และยังคงผลลัพธ์เหมือนเดิม ฉันอยากรู้ว่านี่เป็นปัญหาส่วนหัวเมื่อโพสต์ไปยังเซิร์ฟเวอร์หรือไม่ ฉันใช้ WebAPI แบบกำหนดเองที่เขียนด้วย. Net และไม่ใช่ AWS FYI
ScottN

1
สวัสดี @ScottN เราจะไม่สามารถที่จะทราบว่ามันเป็นปัญหาที่ส่วนหัวจนกว่าคุณจะแก้ปัญหารหัสของคุณโดยใช้การเชื่อมโยงนี้developers.google.com/web/tools/chrome-devtools/...และดูสิ่งที่เกิดข้อผิดพลาดที่คุณได้รับ
Mohamed Makkaoui

6

โดยส่วนตัวแล้วฉันทำสิ่งนี้โดยใช้ngx-material-input-inputสำหรับ front-end และFirebaseสำหรับ back-end การจัดเก็บข้อมูล C ดังแม่นยำยิ่งขึ้นสำหรับ Firebaseสำหรับด้านหลังรวมกับ Cloud Firestore ด้านล่างตัวอย่างซึ่ง จำกัด ไฟล์ไม่เกิน 20 MB และยอมรับเฉพาะนามสกุลไฟล์ที่แน่นอน ฉันใช้Cloud Firestore ด้วยเพื่อจัดเก็บลิงก์ไปยังไฟล์ที่อัพโหลด แต่คุณสามารถข้ามสิ่งนี้ได้

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 (ส่วนตรวจสอบขนาด)

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 (ส่วนอัพโหลดไฟล์)

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

storage.rules

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
ดูดี แต่ทำไมคุณถึงต้องtoString()ติดต่อประกาศแบบฟอร์ม?
trungk18

1
@ trungk18 ตรวจสอบอีกครั้งและคุณพูดtoString()ถูกไม่มีประโยชน์แล้วแก้ไขคำตอบของฉัน สำหรับผู้ที่จะอ่านความคิดเห็นนี้ในตอนท้ายของfileUploaderในcontact.component.ts])].toString()})ฉันมี ตอนนี้มันเป็นเพียง: ])]}).
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
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. แบ็กเอนด์สปริง (ไฟล์จาวา)

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

เราต้องสร้างโฟลเดอร์ "temp" ในไดรฟ์ C จากนั้นรหัสนี้จะพิมพ์ Json ในคอนโซลและบันทึกไฟล์ที่อัพโหลดในโฟลเดอร์ที่สร้างขึ้น


เราจะเรียกไฟล์นั้นได้อย่างไร คุณมีคำแนะนำบ้างไหม?
Siddharth Choudhary

สปริงเซิร์ฟเวอร์ของฉันยังทำงานที่ 8080 และแองกูลาร์กำลังทำงานอยู่ที่ 3000 ตอนนี้เมื่อฉันทำเครื่องหมาย server_url เป็น localhost: 8080 / api / uploadForm มันบอกว่าไม่อนุญาตให้ใช้ cors!
Siddharth Choudhary

ไบต์ [] ไบต์ = file.getBytes (); มันจะให้กระแสไบต์ .. คุณสามารถแปลงเป็นไฟล์สำหรับปัญหา cors คุณสามารถหาทางออกใน google
Shafeeq Mohammed

5

ก่อนอื่นคุณต้องตั้งค่า HttpClient ในโครงการแองกูลาร์ของคุณ

เปิดไฟล์ src / app / app.module.ts นำเข้าHttpClientModuleและเพิ่มลงในอาร์เรย์การนำเข้าของโมดูลดังต่อไปนี้:

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

ถัดไปสร้างองค์ประกอบ:

$ ng generate component home

ถัดไปสร้างบริการอัพโหลด:

$ ng generate service upload

ถัดไปเปิดไฟล์ src / app / upload.service.ts ดังนี้

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

ถัดไปเปิดไฟล์ src / app / home / home.component.ts และเริ่มต้นด้วยการเพิ่มการนำเข้าต่อไปนี้:

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

ถัดไปกำหนดตัวแปร fileUpload และไฟล์และฉีด UploadService ดังนี้:

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

ถัดไปกำหนดเมธอด 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);  
        }  
      });  
  }

ถัดไปกำหนดเมธอด uploadFiles () ซึ่งสามารถใช้เพื่ออัพโหลดไฟล์รูปภาพหลายไฟล์:

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

ถัดไปกำหนดเมธอด 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();  
}

ต่อไปเราต้องสร้างเทมเพลต HTML ของ UI อัพโหลดภาพของเรา เปิดไฟล์ src / app / home / home.component.html และเพิ่มเนื้อหาต่อไปนี้:

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

ลองดูบทช่วยสอนนี้และโพสต์นี้


4

ตัวอย่างที่สมบูรณ์ของการอัพโหลดไฟล์โดยใช้ Angular และ nodejs (ด่วน)

รหัส HTML

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

รหัสส่วนประกอบ 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)
       })
  }

รหัสโหนด 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

อัปโหลดบริการโดยใช้ 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
httpService มาจากไหน
James

@James httpService เป็นโมดูล http ของเชิงมุมเพื่อโทรหาเซิร์ฟเวอร์ http คุณสามารถใช้บริการ http ใด ๆ ที่คุณต้องการนำเข้า {HttpClientModule} จาก '@ angular / common / http';
Rohit Parte

2

ลองสิ่งนี้

ติดตั้ง

npm install primeng --save

นำเข้า

import {FileUploadModule} from 'primeng/primeng';

html

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

1
ฉันเหนื่อยกับการใช้ตัวอย่างด้านบน แต่ฉันได้รับ. /upload.php ไม่พบ
Sandeep Kamath

2
คุณควรระบุ URL ของคุณในที่ที่ควรโหลดแทน upload.php @sandeep kamath
Vignesh

1
@ Vignesh ขอบคุณสำหรับการตอบกลับของคุณ แต่ฉันพบว่าฉันไม่ให้แอตทริบิวต์ url เลยก็โหลดไฟล์ควรเป็นค่าเริ่มต้น
Sandeep Kamath

1
คุณช่วยอธิบายได้ว่าเราจะรับไฟล์เป็น php ได้อย่างไรถ้าเราใช้วิธีนี้
Shaikh Arbaaz

2

ในเชิงมุม 7/8/9

ลิงค์ที่มา

ป้อนคำอธิบายรูปภาพที่นี่

ใช้แบบฟอร์ม 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>

ในชั้นองค์ประกอบ

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;
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.