2017-02-17 4 views
2

Мой REST API возвращает PDF-документ в байтах, и мне нужно вызвать этот API и показать документ PDF на странице ASP для предварительного просмотра пользователю.Как показать ответ потока байтов

Я попытался

Response.Write HttpReq.responseBody 

но пишет некоторые нечитаемый текст на странице. httpReq - это мой объект, через который я вызываю REST API.

Ответ REST API:

Request.CreateResponse(HttpStatusCode.OK, pdfStream, MediaTypeHeaderValue.Parse("application/pdf")) 
+0

Это потому, что 'Response.Write()' пишет текст в текущей 'CodePage' обратно в браузер, если вы хотите отправить обратно двоичные данные, используйте 'Response.BinaryWrite()'. – Lankymart

ответ

1

В классическом ASP, Response.Write() используется для передачи текстовых данных обратно в браузер, используя CodePage и Charset свойства, определенные на Response объекта (по умолчанию это унаследованный от текущий сеанс и расширение конфигурации сервера IIS).

Чтобы отправить двоичные данные обратно в браузер, используйте Response.BinaryWrite().

Вот краткий пример (фрагмент, основанный на том, что у вас уже есть двоичный код от httpReq.ResponseBody);

<% 
Response.ContentType = "application/pdf" 
'Make sure nothing in the Response buffer. 
Call Response.Clear() 
'Force the browser to display instead of bringing up the download dialog. 
Call Response.AddHeader("Content-Disposition", "inline;filename=somepdf.pdf") 
'Write binary from the xhr responses body. 
Call Response.BinaryWrite(httpReq.ResponseBody) 
%> 

В идеале, при использовании REST API с помощью XHR (или любой URL по этому вопросу) вы должны быть проверяя httpReq.Status, чтобы обрабатывать ошибки отдельно возвращения в двоичном, даже установить другой content-type, если есть ошибка.

Вы можете перестроить приведенный выше пример;

<% 
'Make sure nothing in the Response buffer. 
Call Response.Clear() 
'Check we have a valid status returned from the XHR. 
If httpReq.Status = 200 Then 
    Response.ContentType = "application/pdf" 
    'Force the browser to display instead of bringing up the download dialog. 
    Call Response.AddHeader("Content-Disposition", "inline;filename=somepdf.pdf") 
    'Write binary from the xhr responses body. 
    Call Response.BinaryWrite(httpReq.ResponseBody) 
Else 
    'Set Content-Type to HTML and return a relevant error message. 
    Response.ContentType = "text/html" 
    '... 
End If 
%> 

+0

При использовании Response.BinaryWrite() его написания некоторых странных символов в браузере, есть ли способ конвертировать этот двоичный поток в pdf-файл и записывать его в браузере? Спасибо. –

+0

@PrateekMishra * «странные символы» * являются текстовым представлением двоичного файла по какой-либо причине, двоичный файл не рассматривается как допустимый PDF. Вот несколько вещей, которые нужно попробовать: обязательно вызовите 'Response.Clear()' перед 'Response.BinaryWrite() ', чтобы избежать извинения символов, передаваемых в браузер перед двоичным кодом, и убедитесь, что свойство Response.ContentType установлено в соответствующий тип mime PDF. – Lankymart

+0

@PrateekMishra, как вы добрались? Заметили, что вопрос по-прежнему открыт без принятого ответа, пожалуйста, подумайте о голосовании/принятии ответа, чтобы этот вопрос не остался без ответа. – Lankymart

2

Вы должны определить тип содержимого ответа как PDF:

Response.ContentType = "application/pdf" 

Затем записать двоичные данные в ответ:

Response.BinaryWrite(httpReq.ResponseBody) 

Полный пример:

url = "http://yourURL" 

Set httpReq = Server.CreateObject("MSXML2.ServerXMLHTTP") 
httpReq.Open "GET", url, False 
httpReq.Send 

If httpReq.Status = "200" Then 
    Response.ContentType = "application/pdf" 
    Response.BinaryWrite(httpReq.ResponseBody) 
Else 
    ' Display an error message 
    Response.Write("Error") 
End If 
+0

В полном примере я бы проверял 'If httpReq.Status = 200 Then' перед возвратом двоичного файла, поэтому любые ошибки можно обрабатывать независимо, возможно, даже переключать тип содержимого. – Lankymart

+0

Спасибо, хороший совет для статуса ответа. Для типа содержимого я не думаю, что это необходимо, если вызов REST API должен возвращать двоичный файл. – krlzlx

+0

Технически «Content-Type» никогда не требуется, потому что браузер может вывести его, не означает, что вы не должны указывать его явно. – Lankymart

Смежные вопросы