I am new to angular , I learned myself and implemented following code , but this.data is always shows as ‘undefined’.
this.data is always coming has ‘undefined’ – Please let me know what mistake I am doing,
Functionality of my code :- It simple angular page where I upload the .csv file with 5 headers and some data in these columns in the file. After I click on upload same .csv file should be saved to server.
Below is my code, here I am passing filename and file content (in json format) to my .net webAPI, my webapi will save the file to server.
- Please let me know why the this.data is always shows as undefined
- To save the new file to server, what ever I have implemented is that correct approach ?
this is my web API code :-
public class SaveModel
{
public string FileName { get; set; }
public string DestinationPath { get; set; }
public IEnumerable<string> Lines { get; set; }
}
[Route("FileSave")]
public ActionResult FileSave([FromBody] SaveModel model)
{
try
{
this.SaveOperation(model.FileName, model.DestinationPath, model.Lines);
return this.Ok();
}
catch (Exception ex)
{
this.logger.Error("File Save failed.", ex);
}
}
public void SaveOperation(string filename, string destinationPath, IEnumerable<string> lines)
{
StringBuilder stringBuilder = new StringBuilder();
foreach (var line in lines)
{
stringBuilder.AppendLine(line);
}
var byteArray = Encoding.UTF8.GetBytes(stringBuilder.ToString());
this.CreateCSVFile(destinationPath, filename, new MemoryStream(byteArray));
}
CreateCSVFile // this is my code where it calls server and place the .csv file
HTML Code :
<div class="search-form">
<mat-card>
<div class="row">
<div class="col-lg-1">
</div>
<div class="col-lg-11">
<h2 class="font--bold">system</h2>
<form name="#systemform" #systemform="ngForm" role="search" (ngSubmit)="UploadFile(systemform.value)" novalidate>
<!--Start-->
<div class="row">
<div class="col-md-4">
<input #fileUpload type="file" class="file-upload" name="fileUpload" id="fileUpload" accept=".xlsx,.xls,.csv" required (change)="onFileChange($event)">
<div class="invalidFileTypeAlert" *ngIf="invalidFileType">Invalid file type. Allowed: .xlsx, .xls, .csv</div>
</div>
<div class="col-md-4">
<button (click)="UploadFile(systemform.value)" type="button" mat-raised-button color="primary" [disabled]="!fileSelected">Upload</button>
<button (click)="Reset(systemform.value)" mat-raised-button [disabled]="!fileSelected">Reset</button>
<h5>Please upload excel file </h5>
</div>
</div>
</form>
</div>
</div>
</mat-card>
</div>
Below is my componenet code :-
/*fileName = '';*/
fileSelected = false;
invalidFileType = false;
file: File = null; // Variable to store file
data: any;
jsonData: any;
displayError: boolean;
errorText: string;
responseData: any;
@ViewChild('fileUpload') fileUpload: ElementRef;
/*fileName = '';*/
fileSelected = false;
invalidFileType = false;
file: File = null; // Variable to store file
data: any;
jsonData: any;
displayError: boolean;
errorText: string;
responseData: any;
@ViewChild('fileUpload') fileUpload: ElementRef;
Reset(form) {
this.fileUpload.nativeElement.value = "";
console.log("Reset completed");
}
UploadFile(filevalue) {
const reqbody = {
filename: this.file.name,
lines: JSON.stringify(this.data)
};
var route = "FileSave";
this.dataService.post(reqbody, route).subscribe(
(data: any[]) => {
console.log("Response data: " + data);
LoggerService.success(`File successfully uploaded to server`, true, false);
this.responseData = data;
},
(error: Response) => {
this.displayError = true;
this.errorText = `Error saving API service ${error.status}`;
});
}
onFileChange(event: any): void {
this.file = event.target.files[0];
this.fileSelected = true;
this.invalidFileType = false;
this.readFile();
}
readFile(): void {
fileReader.onload = (e: any) => {
const binaryString = e.target.result;
console.log(binaryString);
const workBook = XLSX.read(binaryString, { type: 'binary' });
const workSheetName = workBook.SheetNames[0];
const workSheet = workBook.Sheets[workSheetName];
// Parse the Excel data into JSON format
this.data = XLSX.utils.sheet_to_json(workSheet);
console.log(this.data);
}
}
}
