Загрузка сжатой папки на стороне клиента не работает в angular + node (MEAN) - PullRequest
2 голосов
/ 30 апреля 2019

Мне нужно разрешить пользователю загружать сжатые папки с сервера .Однако мне удалось выполнить сжатие, даже если я попытаюсь прочитать файл tar и отправить его на клиентскую сторону, поскольку файл для загрузки поврежден или сохраняет только один файл из папки (например, 1/7).

IЯ пытался отправить файлы json, и тот же код работал, но для больших файлов и файлов tar он не отправляет весь файл.Я попытался просто отправить файл tar из серверной части на клиентскую сторону для загрузки, но он также не работает.

/* back controller. */
const getDataDownload = function(req,res) {
    if (req.params && req.params.dataId){
        DataModel
            .findById(req.params.dataId)
            .exec((err,data) => {
                if(data){
                    var file = '../data/filename.tar';
                    var stat = fs.statSync(file);
                    res.writeHead(200, {
                        'Content-Type' : 'application/tar',
                        'Content-Length' : stat.size
                    });
                    var tempTarFile = fs.createReadStream(file);
                    tempTarFile.pipe(res);
                }})}
    else {
            res
                .status(404)
                .json({"message":"No Id in request"});
        }
}
/* front controller. */
public dataDownload(dataId: string){
        const url: string = `${this.apiBaseUrl}/dataDownload/${dataId}/`;
        const req = new HttpRequest('GET', url, {
                headers: new HttpHeaders({'Authorization': token}), 
                responseType: 'text' as 'text', 
                reportProgress: true});
        this.http.request(req).subscribe((event: HttpEvent<any>)=>{
            switch (event.type) {
                case HttpEventType.Response:
                    const filename = 'filename.tar'
                    var blob = new Blob([event.body], { type: "application/tar" });
                    saveAs(blob, 'filename.tar')
                    break;
                case HttpEventType.DownloadProgress:
                    console.log(' (',Math.round(event.loaded/event.total),')');
                    break;
            }}
        )

    }

Файл не открывается должным образом и не имеет правильного размера,Пожалуйста, помогите

1 Ответ

1 голос
/ 26 мая 2019

Задний контроллер:

const getDataDownload = function (req, res) {
  if (req.params && req.params.dataId) {
    DataModel
      .findById(req.params.dataId)
      .exec((err, data) => {
        if (data) {
          let file = '/home/pierbjx/Documents/sorfML/test.tar';
          try {
            let stat = fs.statSync(file);
            res.writeHead(200, {
              'Content-Type': 'application/tar',
              'Content-Length': stat.size
            });
            let tempTarFile = fs.createReadStream(file);
            tempTarFile.pipe(res);
          } catch (err) {
            console.log('Error: ' + err);
          }
        }
      })
  }
  else {
    res
      .status(404)
      .json({ "message": "No Id in request" });
  }
}

Фронт-контроллер:

  public dataDownload(dataId: string): void {
    const url: string = `${this.apiBaseUrl}/dataDownload/${dataId}/`;
    const req = new HttpRequest('GET', url, {
      responseType: "blob",
      headers: new HttpHeaders().append("Content-Type", "application/json"),
      reportProgress: true
    });

    this.http.request(req)
      .subscribe(
        event => {
          if (event.type === HttpEventType.DownloadProgress) {
            console.log("Download progress event", event);
          }

          if (event.type === HttpEventType.Response) {
            console.log("response received...", event.body);
            const filename = 'filename.tar';
            saveAs(event.body, filename);
          }

        },
        err => {
          alert("Problem while downloading the file.");
          console.error(err);
        }
      );
  }
...