Загрузка файла в Angular 4
Когда я пытаюсь установить "npm install ng2-file-upload --save" в моем приложении angular 4, оно выдает
UNMET PEER DEPENDENCY @4.1.0
UNMET PEER DEPENDENCY @4.1.0
`-- ng2-file-upload@1.2.1
и загрузка не работает мои приложения бросает
"Невозможно привязать к" загрузчику ", так как это не известное свойство" ввода ""
это мой 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(модуль для родителей).
Может ли кто-нибудь помочь мне в этом, пожалуйста...
6 ответов
Загружайте изображения в Angular 4 без плагина. Это статья, которую стоит попробовать. Загрузить изображения в Angular 4 без плагина
Подчеркнем на эти моменты:
- Использование метода.request() вместо.post
- Отправка данных формы прямо в тело.
- Настройка элементов заголовка и создание нового объекта RequestOptions.
- Чтобы отправить formData с содержимым изображения, вы должны удалить заголовок Content-Type.
Я не думаю, что нам нужны дополнительные библиотеки
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 перетаскиванием
Для общего решения является создание нового модуля, как 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 { }
взгляните на ленивую загрузку в угловых 4
Вам не нужна внешняя библиотека для этого, проверьте ниже пример кода
@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);
}
}
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);
}
}
}
Импортировать файл из файла загрузки или использовать простой загрузчик файлов
HTML
<p-fileUpload name="myfile[]" customUpload="true"
(uploadHandler)="uploadSuiteForRelease($event)" auto="auto"></p-fileUpload>
TS
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];
}
}
}
}