Rails app - send_data从DB发送乱码文件

时间:2012-11-23 22:11:40

标签: ruby-on-rails sql-server ruby-on-rails-3 ms-access ruby-on-rails-3.2

我正在使用rails应用程序来显示存储在sql server db中的数据。数据输入全部通过MS Access前端进入sql server db。 rails app是通过访问应用程序输入的信息的“只读”查看器。

在访问前端,我使用绑定对象框架让用户将各种类型的文档(.pdf,.msg,.docx等)上传到数据库中。该对象存储在我的sqlserver上的varbinary字段中。这在使用Access前端时工作正常。使用正确的主机应用程序正确检索并显示文档。

问题在于将这些相同的对象发送回来通过rails app查看。

当我尝试通过浏览器将二进制数据作为文件发送到文件时,其主机应用程序无法读取收到的文件。文件扩展名对于发送的文件是正确的,但应用程序似乎无法读取它们。我肯定会收到一些东西 - 当我检查记事本中的文件时,我看到文本的片段,但文件有问题,因此MS Word或PDF Reader等无法读取它们。

控制器中的代码非常简单:

def view_word_doc

  a=Attachment.find(params[:id])
  send_data a.Document, :filename => 'flibber.docx'
 end

(Document是具有varbinary的表中的字段)

这在浏览器中有预期的结果,我被问到是否要打开或保存文件,并尝试使用word来打开文档。不过有消息称该文件已损坏。当我尝试打开.pdf,.msg文件等时的类似结果。

我也尝试过使用send_file。在那种情况下,我得到一个控制器错误 -

AttachmentsController#view中的Encoding :: UndefinedConversionError

“\ x81”到UTF-8,从Windows-1252转换为UTF-8

我已经将类型保留为默认类型,我理解的是Application / Octet-stream,但我不是那么熟悉这个意思。

正如我所提到的,这一切都适用于访问前端。只是无法在导轨中正确发送。

1 个答案:

答案 0 :(得分:0)

您可能已编码为在routes.rb中以GET方法接收文件,因此它会尝试在内嵌/浏览器中显示它们,或者可能是视图中使用的链接,而它需要是一个默认使用 POST 方法的按钮。