まずはじめに、私はプログラム初心者です。

環境:rails 4.1.6, ruby 2.1.3

kconvを利用してコード変換処理をしていましたが、MacOS上にvagrantを入れているローカル環境では上手く保存されず、文字化けしております。また、UTF-8環境であるため、kconvを利用せずやっても上手く行きませんでした。

vagrantは標準のUbuntuを使っています。

どう処理すれば、日本語ファイルネームを文字化けせずに保存できるのでしょうか? ちなみに、viewには日本語で正しく表示されるため、経由した後に文字化けしていると思われます。 お手数おかけしますが、ご教示のほどお願い致します。

データの流れですが、

MacBookAir(MacOS X 10.10 Yosemite) → vagrant(Ubuntu10.3+Rails4.1.6+ruby2.1.3) → Macのvagrantフォルダ

となります。

  1. 今回のアップロード対象ファイル名:福ノ神仙壷四郎.jpg
  2. 実行された後のファイル名:τªÅπâÄτÑ₧_Σ╗Öσú╖σ¢¢ΘâÄ.jpg
  3. 期待する格納されるべきファイル名:福ノ神仙壷四郎.jpg
  4. ファイルの確認方法:Macターミナル及びファインダーからの目視確認

Ruby2.1からencoding機能が実装されているようなので、ここらへんも考慮してみたいと思います。

require 'kconv'
# <中略>
def upload_process
  #アップロードファイルを取得
  file = params[:upfile]
  #ファイルのベース名(パスを除いた部分)を取得
  name = file.original_filename
  #許可する拡張子を定義
  perms = ['.jpg', '.jpeg', '.gif', '.png']
  if !perms.include?(File.extname(name).downcase)
    result = 'アップロードできるのは画像ファイルのみです。'
  #アップロードファイルのサイズが1MB以下であるか
  elsif file.size > 1.megabyte
    result = 'ファイルサイズは1MBまでです。'
  else
    #ファイル名をUTF-8→Shift-JISにエンコード
    name = name.kconv(Kconv::SJIS, Kconv::UTF8)
    #/public/docフォルダ配下にアップロードファイルを保存
    File.open("public/docs/#{name}", 'wb') { |f| f.write(file.read) }
    result = "#{name.toutf8}をアップロードしました。"
  end
  #成功/エラーメッセージを保存
  render text: result
end