如何讓CarrierWave在其內容上添加正確的擴展名(取決於 )?例如,如果我上傳文件「徽標」(PNG文件 沒有擴展名),CarrierWave應將其保存爲「logo.png」。並且文件「img.gif」(擴展名不正確的JPG文件)應分別保存爲「img.jpg」。CarrierWave和正確的文件擴展名,具體取決於其內容
回答
有幾件事你可以做,取決於你是否使用process
或version
來做到這一點。
如果是一個版本,carrierwave wiki有辦法做條件版本。 https://github.com/jnicklas/carrierwave/wiki/How-to%3A-Do-conditional-processing
version :big, :if => :png? do
process ...
end
protected
def png?(new_file)
new_file.content_type.include? 'png'
end
如果您使用的process
方法,你可能想看看這個:https://gist.github.com/995663。
添加這些到您的代碼,以繞過約束process
具有
# create a new "process_extensions" method. It is like "process", except
# it takes an array of extensions as the first parameter, and registers
# a trampoline method which checks the extension before invocation
def self.process_extensions(*args)
extensions = args.shift
args.each do |arg|
if arg.is_a?(Hash)
arg.each do |method, args|
processors.push([:process_trampoline, [extensions, method, args]])
end
else
processors.push([:process_trampoline, [extensions, arg, []]])
end
end
end
# our trampoline method which only performs processing if the extension matches
def process_trampoline(extensions, method, args)
extension = File.extname(original_filename).downcase
extension = extension[1..-1] if extension[0,1] == '.'
self.send(method, *args) if extensions.include?(extension)
end
然後,您可以用它來打電話曾經被認爲是過程,有選擇地對每個文件類型
PNG = %w(png)
JPG = %w(jpg jpeg)
GIF = %w(gif)
def extension_white_list
PNG + JPG + GIF
end
process_extensions PNG, :resize_to_fit => [1024, 768]
process_extensions JPG, :...
process_extensions GIF, :...
的問題在於首先確定正確的內容。 Carrierwave使用MimeType gem,它從擴展名中確定其MIME類型。因爲,在你的情況下,擴展是不正確的,你需要一個獲得正確的MIME類型的替代方法。這是我能夠想出的最佳解決方案,但它取決於使用RMagick gem讀取圖像文件的能力。
我遇到了這個問題,不得不爲我的上傳器覆蓋默認的set_content_type方法。這假設你在你的Gemfile中有Rmagick寶石,這樣你就可以從閱讀圖像中獲得正確的mime類型,而不是做出最好的猜測。
注意:如果圖像被僅支持JPG和PNG圖像的Prawn使用,此功能特別有用。
上傳類:
process :set_content_type
def set_content_type #Note we are overriding the default set_content_type_method for this uploader
real_content_type = Magick::Image::read(file.path).first.mime_type
if file.respond_to?(:content_type=)
file.content_type = real_content_type
else
file.instance_variable_set(:@content_type, real_content_type)
end
end
圖片型號:
class Image < ActiveRecord::Base
mount_uploader :image, ImageUploader
validates_presence_of :image
validate :validate_content_type_correctly
before_validation :update_image_attributes
private
def update_image_attributes
if image.present? && image_changed?
self.content_type = image.file.content_type
end
end
def validate_content_type_correctly
if not ['image/png', 'image/jpg'].include?(content_type)
errors.add_to_base "Image format is not a valid JPEG or PNG."
return false
else
return true
end
end
end
在你的情況,你可以添加,改變在此基礎上正確的MIME類型的擴展名的附加的方法(CONTENT_TYPE )。
讓我走上正軌。 – phillyslick
- 1. PHP:如何提供正確的內容類型(取決於文件擴展名?)?
- 2. GetTempFileName()和正確的文件擴展名
- 3. 如何編寫取決於其他擴展名的php擴展?
- 4. 正確的C++文件擴展名
- 5. 正確的SpreadsheetML文件擴展名
- 6. 獲取原始文件擴展名和內容類型
- 7. 上傳文件時獲取不正確的文件擴展名和內容類型
- 8. Rails + Carrierwave + RMagick:GIF轉換爲JPG,但不保存正確的文件擴展名
- 9. powershell - 提取文件名和擴展名
- 10. Rails和Carrierwave,保存具有不同擴展名的版本
- 11. 獲取JavaScript中內容類型的默認文件擴展名?
- 12. 無擴展名的文件獲取內容
- 13. 如何通過ajax擴展表單,具體取決於選擇
- 14. 在GWT FileUpload中指定文件類型取決於擴展名
- 15. Sublime Text 2雙引號字體樣式取決於文件擴展名嗎?
- 16. 是否需要文件擴展名才能正確提供Web內容?
- 17. 移動具有特定文件名和擴展名的文件
- 18. 確定缺少擴展名的圖像的文件擴展名
- 19. 如何從內容類型獲取文件擴展名?
- 20. 正確的MIME'text/enriched'文件格式的文件擴展名?
- 21. 確定擴展名的文件沒有擴展名
- 22. 如何從文本文件中讀取C++中的內容文件擴展名?
- 23. 獲取文件擴展名
- 24. 獲取除擴展名外沒有擴展名的文件名
- 25. 自動重命名批量文件擴展正確的文件
- 26. 什麼是T4模板文件的正確文件擴展名?
- 27. 擴展和加載正確的內容類型與Django模型
- 28. 使用正則表達式查找具有確切擴展名的文件(並且沒有任何內容)
- 29. jQuery animate - 擴展正確的文本內容?
- 30. 如何讀取.7z擴展名文件中的文件的內容
考慮版本路線,如果我想糾正N個版本的M擴展,該怎麼辦?我需要有M * N條件來處理這個問題嗎? – lulalala