2015-12-28 2 views
0

Как я могу сохранить файл REST.Response.Content PDF без его развращения? После сохранения я запускаю PDF и получаю только белый экран. Без содержания.Delphi REST.Client download corrupted PDF

client.BaseURL := URL; 

req.Params.Clear(); 
req.ClearBody(); 
req.Method := TRESTRequestMethod.rmGET; 

    try 
    req.Execute(); 
    except 
    on e: ERESTException do 
    begin 
     //TODO: Error 
    end; 
    end; 

В req.response.content У меня есть PDF в строке. Но всегда, когда я пытаюсь его сохранить, он поврежден.

// Редактировать

function TPDF.saveFile(): TResult; 
var 
    file: TStringStream; 
    f: TFileStream; 
    len: integer; 
    bytes: TBytes; 

begin 

    file := TStringStream.Create(); 
    file.WriteString(response.Content); 

    //f := TFileStream.Create(fileName, fmCreate); 
    bytes := TEncoding.ANSI.GetBytes(response.Content); //i am tryied ANSI, UNICODE, UTF8 

    //f.ReadData(bytes, response.ContentLength); 
    //f.Position := 0; 
    //f.WriteData(bytes, response.ContentLength); 

    file.WriteData(bytes, response.ContentLength); 
    file.SaveToFile(fileName); 
// TFile.WriteAllBytes(fileName, bytes); 
// file.SaveToFile(fileName); 

    result := setResult(kbOK); 
end; 
+0

Можете ли вы также показать код для сохранения Response.Content в .pdf-файле? – mjn

+0

PDF - это двоичный формат, вы не можете хранить его в строке как есть. –

+0

@DalijaPrasnikar правильно, однако контент может быть закодирован base64, и мы еще не знаем ... теперь мы знаем :) – mjn

ответ

1

PDF не использует единый формат кодирования. Ваш код на стороне сервера должен отправить его как двоичные данные, чтобы преобразования строк не могли его испортить. Кроме того, ваш клиент должен обрабатывать ответ как двоичные данные.

+0

С сервера я получаю данные как двоичные, content-type - 'application/json'. Я могу читать PDF напрямую с сервера с помощью браузера. Возможно, у REST.Client есть ограничение и лучше использовать компонент TNetHTTPClient или TIdHTTP? – InnerWorld

+2

@InnerWorld отслеживает HTTP-трафик в браузере (с помощью инструментов разработчика), и вы увидите, что будет возвращен тип содержимого PDF. Реакция application/json, скорее всего, вызвана отсутствием содержимого контента в запросе REST, отправленном с клиента. Таким образом, у вас есть две вещи, которые нужно сделать на стороне клиента: настройка типа ожидаемого типа ответа и доступ к двоичным данным ответа (с помощью TRestResponse.RawBytes) – mjn

+0

Извините, не приложение/json, а приложение/pdf. Слишком много jsons :( – InnerWorld