public IActionResult DownloadFile(string q) { var fullPath = GetSafePath(q); var rangeStart = GetByteOffset(); long fileLength = new FileInfo(fullPath).Length; var fileStream = new EncryptStream(() => new FileStream(fullPath, FileMode.Open), this.coreEncryption, (rangeStart ?? 0) % 512); if (rangeStart == null) { Response.Headers.Add("Content-Length", fileLength.ToString()); } else { long startbyte = rangeStart.Value; fileStream.Position = startbyte; Response.StatusCode = 206; Response.Headers.Add("Content-Length", (fileLength - startbyte).ToString()); string contentRange = string.Format("bytes {0}-{1}/{2}", startbyte, fileLength - 1, fileLength); Response.Headers.Add("Content-Range", contentRange); } Response.Headers.Add("Accept-Ranges", "bytes"); return(File(fileStream, "application/unknown", fileNameHelper.CreateAlternativeFileName(q) + extension)); }