Загрузка файла в Angular 4

когда я пытаюсь установить «npm install ng2-file-upload --save» в моем приложении angular 4, он выдает

UNMET PEER DEPENDENCY @4.1.0
UNMET PEER DEPENDENCY @4.1.0
`-- [email protected]

и загрузка не работает, мои приложения выбрасывают

"Невозможно выполнить привязку к "загрузчику", так как это неизвестное свойство "ввода""

это мой HTML

<input type="file" ng2FileSelect [uploader]="upload" multiple formControlName="file" id="file"/>

и его компонент

import { FileUploadModule } from 'ng2-file-upload/ng2-file-upload';   
import { FileSelectDirective, FileUploader } from 'ng2-file-upload/ng2-file-
upload';

export class PersonalInfoComponent implements OnInit
{
    public upload:FileUploader= new FileUploader({url:""});
}

Родительский модуль

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

@NgModule({

imports: [
..
....
..
FileUploadModule
],

export class RegistrationModule { }

и я ничего не импортировал/не менял в AppModule (главный родительский модуль).

может ли кто-нибудь помочь мне с этим, пожалуйста...


person sandeep    schedule 16.05.2017    source источник


Ответы (6)


Загрузка изображений в Angular 4 без подключаемого модуля Возможно, стоит попробовать эту статью. Загружайте изображения в Angular 4 без плагина

Он акцентирует внимание на этих моментах:

  1. Использование метода .request() вместо .post
  2. Отправка formData прямо в тело.
  3. Настройка элементов заголовка и создание нового объекта RequestOptions.
  4. Чтобы отправить formData с содержимым изображения, вы должны удалить заголовок Content-Type.
person Assil    schedule 27.08.2017
comment
Хорошая статья! Это помогло. - person Adrita Sharma; 13.09.2017

Я не думаю, что нам нужны дополнительные библиотеки

onFileChange(event){
   let files = event.target.files; 
   this.saveFiles(files);
    }
@HostListener('dragover', ['$event']) onDragOver(event) {
    this.dragAreaClass = "droparea";
    event.preventDefault();
}
@HostListener('dragenter', ['$event']) onDragEnter(event) {
    this.dragAreaClass = "droparea";
    event.preventDefault();
}
@HostListener('dragend', ['$event']) onDragEnd(event) {
    this.dragAreaClass = "dragarea";
    event.preventDefault();
}
@HostListener('dragleave', ['$event']) onDragLeave(event) {
    this.dragAreaClass = "dragarea";
    event.preventDefault();
}
@HostListener('drop', ['$event']) onDrop(event) {   
    this.dragAreaClass = "dragarea";           
    event.preventDefault();
    event.stopPropagation();
    var files = event.dataTransfer.files;
    this.saveFiles(files);
}

И теперь мы готовы загружать файлы с помощью перетаскивания, а также нажатием кнопки ссылки и загружать дополнительные данные с файлами.

См. полную статью здесь Angular 4 загружает файлы с данными и веб-API путем перетаскивания

person Ali Adravi    schedule 24.09.2017

Для общего решения - создать новый модуль, например shared module. Вам просто нужно создать такой общий модуль и импортировать общий модуль в файл app.module

import { NgModule } from '@angular/core';
import { FormsModule } from '@angular/forms';

import { FileSelectDirective, FileDropDirective } from 'ng2-file-upload';
import { FileUploadModule } from 'ng2-file-upload/ng2-file-upload';

@NgModule({
     imports: [ FileUploadModule],  
     declarations: [ ],
     exports :[ FileSelectDirective, FileDropDirective, FormsModule,
               FileUploadModule],
})
export class SharedModule { }

просто импортируйте share.module в свой app.module следующим образом.

import { NgModule } from '@angular/core';
import { SharedModule} from '../shared/shared.module';

@NgModule({
    imports: [SharedModule],
    declarations: [],
    exports :[],
   })
export class AppModule { }

взгляните на ленивую загрузку в angular 4

person Sathish Kotha    schedule 01.06.2017
comment
Попробуйте сделать это, но получите эту ошибку, Тип FileSelectDirective является частью объявлений двух модулей: FileUploadModule и PackagesModule! Рассмотрите возможность перемещения FileSelectDirective в модуль более высокого уровня, который импортирует FileUploadModule и PackagesModule. Вы также можете создать новый NgModule, который экспортирует и включает FileSelectDirective, а затем импортирует этот NgModule в FileUploadModule и PackagesModule. - person Damith Ganegoda; 01.12.2017
comment
Я думаю, что вы используете директиву выбора файла в 2 модулях и какую версию вы используете для загрузки файла ng2. - person Sathish Kotha; 03.12.2017

Для этого вам не нужна внешняя библиотека, проверьте приведенный ниже пример кода.

@Component({
    selector: 'app-root',
    template: '<div>'
        + '<input type="file" (change)="upload($event)">'
        + '</div>',
})

export class AppComponent {

    constructor(private _service: commonService) { }

    upload(event: any) {
        let files = event.target.files;
        let fData: FormData = new FormData;

        for (var i = 0; i < files.length; i++) {
            fData.append("file[]", files[i]);
        }
        var _data = {
            filename: 'Sample File',
            id: '0001'
        }

        fData.append("data", JSON.stringify(_data));

        this._service.uploadFile(fData).subscribe(
            response => this.handleResponse(response),
            error => this.handleError(error)
        )
    }
    handleResponse(response: any) {
        console.log(response);
    }
    handleError(error: string) {
        console.log(error);
    }
}

Подробнее

person Prashobh    schedule 23.01.2018

HTML:

<input type="file" (change)="onFileChange($event)" id="file">

TS:

@Component({
  ......
})

export class myComponent{

    form: FormGroup;

    contructor(fb: FormGroup){
       form: fb.group({file: null});
    }

 //fVals comes from HTML Form -> (ngSubmit)="postImage(form.value)" 
    postImage(fVals){
      let body = new FormData();
      body.append('file', formValues.file);

      let httpRequest = httpclient.post(url, body);
      httpRequest.subscribe((response) =>{
         //..... handle response here
      },(error) => {
         //.....handle errors here
      });
   }

   onFileChange(event) {
     if(event.target.files.length > 0) {
       let file = event.target.files[0];
       this.form.get('file').setValue(file);
     }
   }
}
person Uche Dim    schedule 19.12.2017

импортировать загрузку файлов из Primeng или использовать простой загрузчик файлов

HTML

  <p-fileUpload name="myfile[]"  customUpload="true" 
     (uploadHandler)="uploadSuiteForRelease($event)" auto="auto"></p-fileUpload> 

ТС

 var data = new FormData();
        let index: number = 0;
        if (this.files != undefined)
        {
            for (let file of this.files.files)
            {
                data.append("myFile" + index, file);
                ++index;
            }
        }
     data.append('viewModel', JSON.stringify(<<data model that needs to be 
     sent with request>>));

Отправьте эти данные с запросом return this._httpClient.post('api/controller', data);

Сервер

  [HttpPost]
        public async Task<IHttpActionResult> Post()
        {
            HttpPostedFile httpPostedFile = null;
            var viewModel = JsonConvert.DeserializeObject<ReleasesViewModel>(HttpContext.Current.Request["viewModel"]);
            if (viewModel != null)
            {
                if (HttpContext.Current.Request.Files.AllKeys.Any())
                {
                    var cnt = HttpContext.Current.Request.Files.Count;
                    for (int i = 0; i < cnt; i++)
                    {
                        httpPostedFile = HttpContext.Current.Request.Files["myFile" + i];
                    }
                }
            }
        }
person Sara    schedule 09.05.2018