0

Rails と randym/axlsx を使用して Excel ファイルをドロップボックスに保存したいと考えています。

Axlsx::Package オブジェクトを作成できます。シリアル化することもできるので、開発環境のディスクに保存します。

しかし、futuresimple/dropbox-api を使用して Dropbox にアップロードしたいと思います。

それはどれほど難しいでしょうか?

  def save_in_dropbox(project)
    Dropbox::API::Config.app_key    = ENV['DROPBOX_APP_KEY']
    Dropbox::API::Config.app_secret = ENV['DROPBOX_APP_SECRET']
    Dropbox::API::Config.mode = ENV['DROPBOX_ACCESS_TYPE']

    dropbox_client = Dropbox::API::Client.new(:token  => ENV['DROPBOX_CLIENT_TOKEN'], :secret => ENV['DROPBOX_CLIENT_SECRET'])
    logger.info "#{dropbox_client.account}"

    # create Excel file
    p = Axlsx::Package.new
    p.workbook.add_worksheet(:name => "Basic Worksheet") do |sheet|
      sheet.add_row ["First Column", "Second", "Third"]
      sheet.add_row [1, 2, 3]
    end
    p.use_shared_strings = true

    # Next line causes Error: undefined method `length' for true:TrueClass
    # because  p.serialize('file.xlsx')) is true
    # but I don't want to save to my disk, on heroku I couldn't
    # I want to save to my dropbox
    dropbox_client.upload("#{ENV['DROPBOX_ROOT_PATH']}/file.xlsx", p.serialize('file.xlsx')) 

    #p.serialize('c:\file.xlsx') # that saves it to my development env disk :-(

    #uploaded_file = dropbox_client.upload "#{ENV['DROPBOX_ROOT_PATH']}/file.txt", "#{1.second.ago.to_s}\n\r#{project.title}" # Upload to Dropbox works fine

  end
4

1 に答える 1

2

この場合、Package#to_streamを使用することをお勧めします。これにより、アップロード呼び出しに読み込むことができるIOオブジェクトが提供されます。

別の方法は、Package#serializeを使用してディスクに書き込み、ファイルシステムから読み取ることです。

私はdropbox_clientに精通していませんが、IOストリームを正しく処理しなかった場合は驚きます。

一番

-randym

于 2013-02-11T10:24:08.250 に答える