Rails send_file/send_data - не удается прочитать файл - после вызова веб-службы

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

Ответ XML выглядит примерно так:

<RenderResponse>
  <Result>blahblah this is the file info<Result>
  <Extension>PDF</Extension>
  <MimeType>application/pdf</MimeType>
</RenderResponse>

Затем я пытаюсь преобразовать тег "Результат" в файл следующим образом:

@report = @results[:render_response][:result]
@report_name = MyReport.pdf
File.open(@report_name, "w+") do |f|
  f.puts @report
end

наконец я пытаюсь отправить в браузер:

send_file File.read(@report_name), :filename => @report_name, :type => "application/pdf; charset=utf-8", :disposition => "attachment"

Это приводит к ошибке "Не удается прочитать файл", и он выплевывает весь текст из тега результатов.

Если я использую send_data как так:

send_data File.read(@report_name).force_encoding('BINARY'), :filename => @report_name, :type => "application/pdf; charset=utf-8", :disposition => "attachment"

Загрузка работает, но я получаю файл с 0 КБ и ошибкой Adobe, который говорит, что файл "MyReport.pdf" не может быть открыт, потому что "он либо не поддерживается типом файла, либо он поврежден".

Как я могу получить информацию о файле ответов XML, создать файл и передать его в браузер?

1 ответ

Решение

Я нашел решение. send_file - это правильный механизм потока, который мне нужно использовать, но мне нужно было декодировать строку во время записи в файл. Мне также нужно добавить параметр 'b' в вызов File.open.

Это работает:

File.open(@report_name, "wb+") do |f|
  f.puts Base64.decode64(@report)
end



@file = File.open(@report_name, 'r')

   send_file @file, :filename => @report_name, :type => "application/pdf; charset=utf-8", :disposition => "attachment"
Другие вопросы по тегам