2

MSSQL 2005 を使用しています。

zipファイルのコンテンツを含むStringIOオブジェクトがあります。

zipバイナリデータを取得する方法は次のとおりです。

    stringio = Zip::ZipOutputStream::write_buffer do |zio|
        Eclaim.find_by_sql("SET TEXTSIZE 67108864")
        zio.put_next_entry("application.xml")
        #zio.write @claim_db[:xml]
        biblio = Nokogiri::XML('<?xml version="1.0" encoding="utf-8"?>' + @claim_db[:xml], &:noblanks)
        zio.write biblio.to_xml

        builder = Nokogiri::XML::Builder.new(:encoding => 'utf-8') do |xml|
            xml.documents {
                docs.where("ext not in (#{PROHIBITED_EXTS.collect{|v| "'#{v}'"}.join(', ')})").each{|doc|
                    zio.put_next_entry("#{doc[:materialtitle_id]}.#{doc[:ext]}")
                    zio.write doc[:efile]

                    xml.document(:id => doc[:materialtitle_id]) {
                        xml.title doc[:title]
                        xml.code doc[:code]
                        xml.filename "#{doc[:materialtitle_id]}.#{doc[:ext]}"
                        xml.extname doc[:ext]
                    }

                }
            }
        end

        zio.put_next_entry("docs.xml")
        zio.write builder.to_xml
    end

    stringio

私のコントローラーで私は試します:

data.rewind
@claim.docs.create(
    :title => 'Some file',
    :ext => 'zip',
    :size => data.length,
    :receive_date => Time.now,
    :efile => data.sysread
)

しかし、Railsは UTF-8 の無効なバイト シーケンスを訴えます。

助けてください。

4

3 に答える 3

6

ストリームが UTF-8 ストリームとして構成されている場合、圧縮されたバイナリ (任意の値が含まれている可能性があります) を書き込むことはできません。

data書き込み前にバイナリストリームとして設定すると思います:

data.force_encoding "ASCII-8BIT"

役立つかもしれません。

于 2012-05-13T13:25:59.050 に答える
1

問題を構成要素に分解し、小さな単位でトラブルシューティングを行う必要があります。問題の原因に到達するまで複雑さを取り除きます。たとえばDocument.create、コントローラ コードにバグがある可能性を排除するために、たとえばコンソールの属性を使って簡単なことを試してみましたか? のようなものDocument.create :efile => File.read('sometiny.zip')で、そこから行くだけです。

それが機能するか壊れると仮定すると、サポート リクエストがはるかに簡単になり、ノイズと問題の比率が少なくなります。現時点では、単純なバイナリ データの徹底的なテストを行っているため、SQL Server アダプターや接続モードではなく、コントローラー コードを疑っています。上記が機能しないと仮定すると、小さなコンポーネントの調査に移ることができます。

たとえば、efile列のデータ型は何ですか? コンソールでこれを実行して確認Document.columns_hash['efile']し、@sql_type. のような適切なものvarbinary(max)ですか?

次に、SQL Server アダプター TinyTDS で使用している接続モードを教えてください。デフォルトでは、TinyTDS は必要に応じてすべてを UTF8 に変換し、非常にスマートです。バイナリからさまざまなエンコーディングまで、すべてをテストしました。ところで、TinyTDS を使用している場合、FreeTDS を libiconv でコンパイルして、これらすべてを適切に実行できるようにしましたか? tsql -Cパスに FreeTDS のバイナリがあると仮定すると、コンソールで次のように実行することで簡単に確認できます。これにより、数行が出力されるはずです。「iconv library: yes」を探してください。また、0.91 以上を実行していることも確認してください。

最後に、SET TEXTSIZE が間違っているというちょっとしたアドバイスがあります。接続ごとに 1 回だけ実行します。こちらをご覧ください https://github.com/rails-sqlserver/activerecord-sqlserver-adapter#configure-connection--app-name

于 2012-05-13T14:39:49.977 に答える
1

文句、ルビー、ActiveRecord、または SQL Server とは何ですか? 私の推測では、SQL Server です。データベースの efile フィールドのデータ型がバイナリ BLOB であることを確認してください。

于 2012-05-13T10:55:30.317 に答える