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"