アプリケーションの添付ファイルにペーパークリップを使用しています。たくさんの古いデータのインポートスクリプトを書いていますが、ディスク上のファイルからペーパークリップオブジェクトを作成する方法がわかりません。私の最初の推測は、モックCGIマルチパートオブジェクトを作成することですが、それは少し大雑把な解決策のようで、最初の試みは失敗しました。to_tempfileメソッドを正しく取得できなかったためだと思います。
これを行う正しい方法はありますか?かなり簡単なはずのようです。
アプリケーションの添付ファイルにペーパークリップを使用しています。たくさんの古いデータのインポートスクリプトを書いていますが、ディスク上のファイルからペーパークリップオブジェクトを作成する方法がわかりません。私の最初の推測は、モックCGIマルチパートオブジェクトを作成することですが、それは少し大雑把な解決策のようで、最初の試みは失敗しました。to_tempfileメソッドを正しく取得できなかったためだと思います。
これを行う正しい方法はありますか?かなり簡単なはずのようです。
同じことをしたことはわかっています。各ファイルへのパスからFileオブジェクトを作成し、それをimage属性に割り当てたと思います。ペーパークリップはそのファイルで実行されます。
thing.image = File.new("/path/to/file.png")
thing.save
これはローカルファイルには適していますが、リモートファイルには適していません。画像のアップロードにペーパークリップを使用するアプリがあります。これらの画像はAmazons3に保存されています。とにかく、インポートする必要のある古いデータがいくつかあったので、次のことを試しました。
thing.image = open('http://www.someurl.com/path/to/image.jpg')
thing.save
ファイルが小さい場合(たとえば、10K未満)、openuriはstringioオブジェクトを返し、私のファイルはstringio.txtとしてs3に保存されます。
ファイルが約10Kより大きい場合、openuriはTempFileオブジェクトを返します。ただし、s3のファイル名は一意になりますが、実際にはimage.jpgの元のファイル名とは関係ありません。
次の手順で問題を解決できました。
remote_photo = open('http://www.someurl.com/path/to/image.jpg')
def remote_photo.original_filename;base_uri.path.split('/').last; end
thing.image = remote_photo
thing.save