Railsアプリを使用して、SQLServerデータベースに保存されているデータを表示しています。データ入力はすべて、MSAccessフロントエンドを介してSQLServerデータベースに行われます。Railsアプリは、アクセスアプリを介して入力された情報の「読み取り専用」ビューアです。
アクセスフロントエンドでは、バインドされたオブジェクトフレームを使用して、ユーザーがさまざまな種類(.pdf、.msg、.docxなど)のドキュメントをデータベースにアップロードできるようにします。オブジェクトは、SQLServerのvarbinaryフィールドに格納されています。これは、Accessフロントエンドを使用する場合に正常に機能します。ドキュメントは適切に取得され、適切なホストアプリで表示されます。
問題は、それらの同じオブジェクトを返送して、railsアプリで表示できるようにする場合です。
バイナリデータをブラウザからファイルとして送信しようとすると、受信したファイルがホストアプリで読み取れなくなります。送信されたファイルのファイル拡張子は正しいですが、アプリケーションはそれらを読み取ることができないようです。メモ帳でファイルを調べると、テキストのスニペットが表示されますが、ファイルに問題があるため、MSWordやPDFリーダーなどで読み取れません。
コントローラのコードは非常に単純です。
def view_word_doc
a=Attachment.find(params[:id])
send_data a.Document, :filename => 'flibber.docx'
end
(ドキュメントは、varbinaryを持つテーブル内のフィールドです)
これはブラウザで期待される結果をもたらします。ファイルを開くか保存するかを尋ねられ、wordを使用してドキュメントを開こうとします。しかし、言葉は文書が壊れていると言います。.pdf、.msgファイルなどを開こうとすると同様の結果になります。
send_fileも使ってみました。その場合、コントローラーエラーが発生します-
AttachmentsController#viewのEncoding ::UndefinedConversionError
「\x81」からUTF-8への変換(Windows-1252からUTF-8への変換)
タイプをデフォルトのままにしました。これはApplication/Octet-streamであると理解していますが、これが何を意味するのかについてはあまり詳しくありません。
前述したように、これはすべてアクセスフロントエンドで正常に機能します。Railsで正しく送信できません。