Кутове завантаження файлу


193

Я початківець з Angular, я хочу знати, як створити частину для завантаження файлу Angular 5 , я намагаюся знайти будь-який підручник чи документ, але я ніде нічого не бачу. Будь-яка ідея для цього? І я спробував ng4-файли але це не працює для Angular 5


2
так що ви хочете перетягнути або просто Choose Fileзавантажити BTN? Bdw в обох випадках u просто завантажте за допомогою FormData
Dhyey

4
Погляньте на primeng, я його використовую вже деякий час, і він працює з кутовим v5. primefaces.org/primeng/#/fileupload
Bunyamin Coskuner

Для тих , хто просто потрібно завантажити JSON клієнта, перевірити це питання: stackoverflow.com/questions/54971238 / ...
AnthonyW

Відповіді:


427

Ось робочий приклад завантаження файлу в api:

Крок 1: Шаблон HTML (file-upload.component.html)

Визначте простий тег вводу типу file. Додайте функцію до (change)-event для обробки вибору файлів.

<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 Ви активували поліфіли?
Грегор Дорощенко

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 та body одночасно.
Грегор Дорощенко

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

Крок за кроком

Веб-API ASP.NET

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

Сервіс ТС

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
Який твій спосіб не надсилати заголовки?
Шалом Дахан

14

Дуже простий і швидкий метод - це використання ng2-file-upload .

Встановіть 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"/>

У вашому компоненті:

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

Це найпростіше використання цього. Щоб знати всю силу цього дивіться демонстрацію


4
як отримати відповідь при завантаженні зображення? яка буде відповідь, у документації відсутня ця частина.
Мухаммед Шахзад

7

Я використовую Angular 5.2.11, мені подобається рішення, надане Грегором Дорощенком, однак я помітив, що завантажений файл має нульовий байт, мені довелося внести невелику зміну, щоб він працював на мене.

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, яка спрощує цей процес завантаження файл з кутовими 6 і 7, все що вам потрібно зробити:

Встановіть останній кутовий CLI

yarn add global @angular/cli

Потім встановіть rx-compat для проблеми сумісності

npm install rxjs-compat --save

Встановіть ng2-file-upload

npm install ng2-file-upload --save

Імпортуйте директиву FileSelectDirective у свій модуль.

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

Для кращого розуміння ви можете переглянути це посилання: Як завантажити файл з кутовим 6/7


1
Дякуємо за посилання Завантаження працює добре на робочому столі, але я не можу протягом життя отримувати завантаження для роботи на мобільних пристроях, таких як iOS. Я можу вибрати файл із рулону камери, але коли я завантажую, він завжди не вдається. Будь-які ідеї? FYI, запускаючи це в мобільному сафарі, а не в встановленому додатку.
Скотн

1
Привіт @ScottN, і ласкаво просимо, можливо, проблема виходить із браузера, який ви використовуєте? ви тестували його з іншим?
Мохамед Маккауї

1
Привіт @Mohamed Makkaoui дякую за відповідь. Я спробував це в Chrome на iOS і все одно той же результат. Мені цікаво, чи це проблема заголовка під час публікації на сервері? Я використовую користувальницький WebAPI, написаний на .Net, а не AWS FYI.
Скотн

1
Привіт @ScottN, ми не зможемо дізнатись, чи це проблема із заголовком, поки ви не налагодите свій код за допомогою цього посилання developers.google.com/web/tools/chrome-devtools/… та подивіться, яке повідомлення про помилку ви отримуєте.
Мохамед Маккауї

6

Особисто я роблю це, використовуючи ngx-material-file-input для переднього та Firebase для заднього. Точніше C- гучне зберігання для Firebase для бек-енду в поєднанні з Cloud Firestore. Нижче наведено приклад, який обмежує розмір файлу не більше 20 МБ та приймає лише певні розширення файлів. Я також використовую 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()Чудово виглядайте , але навіщо вам потрібно у декларації contactForm?
trungk18

1
@ trungk18 перевіри це ще раз, і ти маєш рацію, toString()це марно, відредагував мою відповідь. Для тих , хто буде читати цей коментар, в кінці fileUploaderв contact.component.ts я мав ])].toString()}). Тепер просто : ])]}).
Даніель Данієлецький

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. t Файл
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. Резервна весна (файл 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";
    }
}

Треба створити папку "temp" на диску C, тоді цей код буде надрукувати Json у консолі та зберегти завантажений файл у створеній папці


Як ми можемо отримати цей файл? Чи є у вас якісь вказівки щодо цього?
Сіддхарт Чодхарі

Також мій весняний сервер працює на 8080, а угловий працює на 3000. Тепер, коли я позначаю server_url як localhost: 8080 / api / uploadForm, він говорить, що корси заборонені!
Сіддхарт Чодхарі

байт [] байт = file.getBytes (); це дасть потік байтів .. Ви можете перетворити його у файл, для проблеми із
корсом

5

По-перше, вам потрібно встановити HttpClient у своєму проекті Angular.

Відкрийте файл 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 шаблон нашого інтерфейсу завантаження зображень. Відкрийте файл 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

Повний приклад завантаження файлів за допомогою кутових та 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-коду

Контролер API fileUpload

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

Служба завантаження за допомогою мультера

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 httpService - це модуль http кутового для здійснення http-дзвінка на сервер. Ви можете використовувати будь-яку службу http, яку ви хочете.import {HttpClientModule} з "@ angular / common / http";
Рохіт Парте

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 не знайдено.
Сандіп Камат

2
Ви повинні вказати свою адресу , по якому він повинен бути завантажений замість upload.php @sandeep Kamath
Вігнеш

1
@Vignesh дякую за вашу відповідь. Але я виявив, що я не даю атрибуту url взагалі, він завантажує файл, має бути типовим.
Sandeep Kamath

1
Чи можете ви, будь ласка, пояснити, як ми можемо отримати файл у php, якщо ми робимо цей метод.
Шейх Арбааз

2

У кутовій 7/8/9

Посилання на джерело

введіть тут опис зображення

Використання форми завантаження

<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;
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.