سلام؛ اگر قصد داشته باشیم از طریق Angular 2 دانلود رو فراخوانی کنیم ، به شکلی که یک فایل حجیم بر روی مرورگر کاربر دانلود بشه ، پیاده سازی به چه صورت خواهد بود ، الان شما در سمت سرور یک حلقه while دارید که محتوی رو میخونه ، این یعنی در هر اجرای حلقه من باید محتوی خوانده شده رو return کنم به کلاینت و دوباره با آفست جدید فراخوانی کنم؟
نحوه فراخوانی من به شکل زیر هست که با FileStreamResult برگشتی از سمت سرور به درستی کار میکنه ولی خب همه فایل رو یکجا برمی گردونه :
downloadOrder(orderId: number , userId : string) { this._http.get(this._config.getApiURI() + '/Download/productfile/' + orderId + '/' + userId, { observe: 'blob'}) .subscribe( (data) => { if(this._functionService.isNullOrEmpty(data.body)){ this._snackBarService.error('فایل پیدا نشد'); return; } var contentType = data.body.type || "application/octet-stream"; var fileInfo = JSON.parse(data.headers.get('FileInfo')); var blob = new Blob([data.body], { type: contentType }); var url = window.URL.createObjectURL(blob); var anchor = document.createElement("a"); anchor.setAttribute("href", url) anchor.setAttribute("download", fileInfo.fileName + fileInfo.fileType); anchor.setAttribute("target", "_blank"); document.body.appendChild(anchor); anchor.click(); setTimeout(function () { document.body.removeChild(anchor); window.URL.revokeObjectURL(url); }, 200); }, error => { this._snackBarService.error(error); }); }
نحوه پیاده سازی کد پایین به چه شکل میشه
while ((bytesRead = await stream.ReadAsync(buffer, 0, buffer.Length)) > 0) { await Response.Body.WriteAsync(buffer); //return File(buffer, GetContentType(fullPath), newFileName, true); //return new FileStreamResult(stream,"application/octet-stream"); }