Estoy tratando de devolver un archivo para que un usuario lo descargue cuando hace clic en un botón de descarga en la página. El truco es que estoy descargando el archivo desde un servicio de URL interno. lo tengo configurado de la siguiente manera
El controlador de descarga es una función a la que llamo para devolver el archivo ()
public class DownloadController : ControllerBase { public FileResult DownloadFile(string url) { WebClient internalDownload = new WebClient(); byte[] bytes = internalDownload.DownloadData(url); return File(bytes, "application/octet-stream", "test" + ".txt"); } }
El controlador API esto es lo que llama el JS
public class TickController : ApiController { [Route("api/Tick/Download")] [HttpPost] public async Task<IActionResult> Download([FromBody] string ID) { string url = await GetFile("D00023974"); DownloadController downloader = new DownloadController(); return downloader.DownloadFile(url); } }
El Javascript que tengo para fines de prueba en este momento.
El API Manager Javascript que envía la solicitud al controlador anterior:
export class ApiCall { static post(controller: string, action: string, data: any, qString?: string) { var url = '/api/' + controller; if (action != null) url += '/' + action; if (querystring != null) url += "?" + qString; return $.ajax({ url: url, data:JSON.stringify(data), method: 'POST', dataType: 'json', contentType: 'application/json; charset=utf-8', }); } }
Y la llamada de prueba actual y verificar si está devolviendo algo.
async downloadAttach(ID: any) { window.open(await WebApiManager.post('Tick', 'Download', ID)); }
Lo anterior devuelve un objeto de la siguiente manera:
[[Prototype]] Object ContentType application/octet-stream FileContents //Filled with Base64 FileDownloadName test.txt _proto_ Object
Sin embargo, no estoy seguro de cómo iniciar la descarga en el lado del cliente del archivo devuelto. Cualquier ayuda sería muy apreciada.