I have an read file functionality that is implemented like:

import { Injectable } from '@angular/core';
import { Observable } from 'rxjs';
import * as Papa from 'papaparse';

@Injectable({
  providedIn: 'root'
})
export class FileReaderService {
  constructor() {}

  // NOTE: the file-reader service currently only supports JSON and CSV files
  read<T = unknown>(file: File) {
    return new Observable<T>(observer => {
      const fileReader = new FileReader();

      fileReader.onload = () => {
        try {
          if (file.type === 'text/csv') {
            const jsonFile = this.csvToJson(fileReader.result as string);

            observer.next(jsonFile);
          } else {
            observer.next(JSON.parse(fileReader.result as string));
          }
          observer.complete();
        } catch (e) {
          observer.error(e);
        }
      };

      fileReader.onerror = event => {
        observer.error(event);
      };

      fileReader.readAsText(file);
    });
  }

  private csvToJson(fileReader: string): any {
    return Papa.parse(fileReader, {
      header: true,
      skipEmptyLines: true
    }).data;
  }
}

This file read functionality is called by an upload file functionality such as

private uploadFile(selectedFile: File) {
    this.ref.data.uploadService
      .upload(this.ref.data.entityGuid, selectedFile)
      .pipe(
        tap(progressEvent => this.handleUploadProgress(progressEvent)),
        skipWhile(progressEvent => !this.isUploadComplete(progressEvent)),
        delay(this.uploadDelay),
        finalize(() => this.cdr.detectChanges())
      )
      .subscribe({
        next: event => {
          this.handleUploadNextEvent(event);
          this.mixpanelService.sendSuccessEventMixpanel(
            ExperienceFeature.BULK_MAINTENANCE_UPLOAD,
            this.ref.data.name,
            this.ref.data.entityGuid,
            this.ref.data.entityName
          );
        },
        error: error => {
          this.handleUploadError(error);
          this.mixpanelService.sendErrorEventMixpanel(
            error,
            this.ref.data.name,
            this.ref.data.entityGuid,
            ExperienceFeature.BULK_MAINTENANCE_UPLOAD,
            this.ref.data.entityName
          );
        }
      });
  }

I am able to upload and read the file as expected but the problem is when I try to first upload a file this works as expected but when I try to modify and edit the same file and save it while this file is opened (such as a csv spreadsheet) and upload this changed file then I get the error of

"The requested file could not be read, typically due to permission problems that have occurred after a reference to a file was acquired."

I am using the FileReader API to read and upload file. I think what I need to implement is some kind of cleanup to ensure that the file handler is currently not being used by another file since this issue only happens when I want to upload the same file after I try to edit and save this opened file before uploading.

0

There are 0 best solutions below