簡體   English   中英

rails4,carrierwave上傳文件名太長

[英]rails4, carrierwave upload file name too long

我正在使用carrierwave remote_url上傳圖像。

info.remote_image_url = "IMG_URL_HOST/IMG_PAHT/IMG_NAME"

返回錯誤消息是

Errno :: ENAMETOOLONG:文件名太長@ rb_sysopen
- 從/Users/kai/.rvm/rubies/ruby-2.1.2/lib/ruby/ /Users/kai/rails/rails_pjt/public/uploads/tmp/1421373782-65124-7719/D-__E1_84_8B_E1_85_A1_E1_86_AB_E1_84_8C_E1_85_B5_E1_84_8B_E1_85_A7_E1_86_AB__E1_84_82_E1_85_A1_E1_86_AF_E1_84_8D_E1_85_A1_E1_84_87_E1_85_A7_E1_86_AF_E1_84_8B_E1_85_A5_E1_86_B8_E1_84_86_E1_85_AE_0423__E1_84_8B_E1_85_A9_E1_84_85_E1_85_B3_E1_84_89_E1_85_A5_E1_86_BC_E1_84_92_E1_85_A7_E1_86_BC_E1_84_8B_E1_85_AC_E1_84_80_E1_85_AA-_E1_84_80_E1_85_AE_E1_86_BA_E1_84_83_E1_85_A1_E1_86_A8__E1_84_87_E1_85_A9_E1_86_AF_E1_84_85_E1_85_B2_E1_86_B7_E1_84_8C_E1_85_B5_E1_84_87_E1_85_A1_E1_86_BC_E1_84_8B_E1_85_B5_E1_84_89_E1_85_B5_E1_86_A8__E1_84_86_E1_85_A1_E1_86_AF_E1_84_84_E1_85_A9_E1_86_BC_E1_84_80_E1_85_A1_E1_84_85_E1_85_B5_orps3_landing_05.jpg 2.1.0 / fileutils.rb:1396:在'initialize'中

圖片文件的長度為101

但編碼為UTF-8后,長度為637

他們找到了解決方案

http://stackoverflow.com/questions/16472894/modify-filename-before-saving-with-carrierwave

但這是不同版本的圖像路徑

ex) file_name     : D-__E1_84_8B_E1_85_A1_E1_86_AB_E1_84.png
android_version   : android_D-__E1_84_8B_E1_85_A1_E1_86_.png
thumbnail_version : thumbnail_D-__E1_84_8B_E1_85_A1_E1_8.png

如何解決擴展文件名限制。

根據 (已拒絕)請求,您可以將此代碼放入初始化程序中,並修復問題

# Monkey patch for long filenames
# @see https://github.com/carrierwaveuploader/carrierwave/pull/539/files
module CWRemoteFix

  # 255 characters is the max size of a filename in modern filesystems
  # and 100 characters are allocated for versions
  MAX_FILENAME_LENGTH = 255 - 100

  def original_filename
    filename = super
    if filename.size > MAX_FILENAME_LENGTH
      extension = (filename =~ /\./) ? filename.split(/\./).last : false
      # 32 for MD5 and 2 for the __ separator
      split_position = MAX_FILENAME_LENGTH - 32 - 2
      # +1 for the . in the extension
      split_position -= (extension.size + 1) if extension
      # Generate an hash from original filename
      hex = Digest::MD5.hexdigest(filename[split_position, filename.size])
      # Create a new name within given limits
      filename = filename[0, split_position] + '__' + hex
      filename << '.' + extension if extension
    end
    # Return original or patched filename
    filename
  end

end

# Monkeypatch downloader class using prepend
CarrierWave::Uploader::Download::RemoteFile.prepend CWRemoteFix

此修補程序會將文件重命名為<prefix-from-original-filename>__<md5-of-original-filename>.<extension-if-present>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM