2017-03-12 3 views
0

내 .NET AJAX 요청을 처리 할 수 ​​있도록 .NET Core 서버에 BLOB로 PDF를 보내야합니다. 그것을 다시 PDF로 변환하여 다운로드 할 수 있습니다.C#을 BLOB로 열고 JS를 BLOB로 다운로드

간접 지정의 이유는 파일이 AJAX를 통해서만 액세스되는 API에 있기 때문입니다. 베어러 토큰이 필요하기 때문에 내가 만든 사이트에 대한 쿠키가 없으므로 배후의 양식 만 사용할 수는 없습니다. (기이한데, 나도 알아,하지만 그게 현재 어떻게 그 부분을 변경하고 싶지 않아)

내 C# 측에서 아래에 나와있는 몇 가지 변형을 시도했다. ApiResponseboolstring (이름이 message)을 사용하는 컨테이너 일 뿐이므로 요청이 좋은지 아닌지 알 수 있습니다.

이들은

내가 밖으로 다시 구문 분석하는 동일한 순서로,

return new ApiResponse(true, File.ReadAllText(path)); 
return new ApiResponse(true, Convert.ToBase64String(File.ReadAllBytes(path))); 
return new ApiResponse(true, JsonConvert.SerializeObject(File.ReadAllBytes(path))); 

그리고 JS 측의 노력했습니다 무엇인가, 내가 가진 :

// Get the response in object form, since it's sent as an ApiResponse 
const response = JSON.parse(xmlhttp.response); 

const text = response.message; 
const text = atob(response.message) 
const text = JSON.parse(response.message) 

나는 또한 시도했다 그런 다음

const text = atob(JSON.parse(response.message)) 

같은 일들이 텍스트와 나는이 일을 해요 :

const blob = new Blob([text], {type: "application/pdf"}); 
const url = URL.createObjectURL(blob); 
const a = document.createElement("a"); 
a.href = url; 
a.download = "file.pdf"; 

document.body.appendChild(a); 
a.click(); 

그리고 다운로드 한 파일이 올바르게 생성됩니다. 그러나 해당 파일이 유효하지 않습니다. 손상되었습니다.

저는이 시점에서 꽤 꼼짝 못했습니다. 자바 스크립트로 파일을 다운로드 할 때이 방법을 사용하여 처음부터 끝까지 뭔가를 찾을 수 없었습니다. 그것은 뒷면이나 앞면 중 하나지만 결코 묶여 있지 않습니다.

그렇다면 PDF BLOB를 성공적으로 전송하고 프런트 엔드에서 다시 생성하여 다운로드 할 수 있습니까?

답변

0

변환하는 방법에 대한 쉬운 대답은 입니다.이 아닙니다.

모든 최신 브라우저는 기본적으로 64 비트 인코딩을 지원하므로 다운로드하기 전에 데이터를 다시 BLOB로 변환 할 필요가 없습니다.

따라서, 일단 코드 :

const a = document.createElement("a"); 
a.href = "data:application/pdf;base64," + response.message; 
a.download = "file.pdf"; 

document.body.appendChild(a); 
a.click();