不同文件类型的载波文件上传
Carrierwave file upload with different file types
我的 FileUploader 如下:
class FileUploader < CarrierWave::Uploader::Base
include CarrierWave::MiniMagick
version :thumb, if: :image? do
# For images, do stuff here
end
version :preview, if: :pdf? do
# For pdf, do stuff here
end
protected
def image?(new_file)
new_file.content_type.start_with? 'image'
end
def pdf?(new_file)
new_file.content_type.start_with? 'application'
end
end
我从载波 github 页面上得到了这个。它主要工作,但如果我不想要不同的版本怎么办?如果它是 pdf,我基本上只想执行某些过程,如果它是图像,我只想执行某些过程。将来我也可能允许其他类型的文件,所以如果我也能有一个简单的方法来做到这一点,那就太棒了。
举个例子,如果是图片,我可能想使用 imgoptim,如果是 pdf,我可能想使用 pdf 优化库,等等。
我试过了:
if file.content_type = "application/pdf"
# Do pdf things
elsif file.content_type.start_with? 'image'
# Do image things
end
但出现错误:NameError: (undefined local variable or method
file' for FileUploader:Class`
该异常表明您正在 Class 级别范围内调用实例变量。
添加调试器断点并打印出 self 你就会明白发生了什么。
解决这个问题的方法是将您的逻辑包装到实例方法中,并将此方法用作默认过程。
process :process_file
def process_file
if file.content_type = "application/pdf"
# Do pdf things
elsif file.content_type.start_with? 'image'
# Do image things
end
end
通过这样做,您可以摆脱不需要的版本,并根据 mime 类型处理您想要的任何内容。
尝试在 process
中使用 if
,例如
process :action, :if => :image?
相关:
Conditional versions/process with Carrierwave
你应该尝试这样使用
class FileUploader < CarrierWave::Uploader::Base
include CarrierWave::MiniMagick
process :process_image, if: :image?
process :process_pdf, if: :pdf?
protected
def image?(new_file)
new_file.content_type.start_with? 'image'
end
def pdf?(new_file)
new_file.content_type.start_with? 'application'
end
def process_image
# I process image here
end
def process_pdf
# I process pdf here
end
end
我的 FileUploader 如下:
class FileUploader < CarrierWave::Uploader::Base
include CarrierWave::MiniMagick
version :thumb, if: :image? do
# For images, do stuff here
end
version :preview, if: :pdf? do
# For pdf, do stuff here
end
protected
def image?(new_file)
new_file.content_type.start_with? 'image'
end
def pdf?(new_file)
new_file.content_type.start_with? 'application'
end
end
我从载波 github 页面上得到了这个。它主要工作,但如果我不想要不同的版本怎么办?如果它是 pdf,我基本上只想执行某些过程,如果它是图像,我只想执行某些过程。将来我也可能允许其他类型的文件,所以如果我也能有一个简单的方法来做到这一点,那就太棒了。
举个例子,如果是图片,我可能想使用 imgoptim,如果是 pdf,我可能想使用 pdf 优化库,等等。
我试过了:
if file.content_type = "application/pdf"
# Do pdf things
elsif file.content_type.start_with? 'image'
# Do image things
end
但出现错误:NameError: (undefined local variable or method
file' for FileUploader:Class`
该异常表明您正在 Class 级别范围内调用实例变量。 添加调试器断点并打印出 self 你就会明白发生了什么。
解决这个问题的方法是将您的逻辑包装到实例方法中,并将此方法用作默认过程。
process :process_file
def process_file
if file.content_type = "application/pdf"
# Do pdf things
elsif file.content_type.start_with? 'image'
# Do image things
end
end
通过这样做,您可以摆脱不需要的版本,并根据 mime 类型处理您想要的任何内容。
尝试在 process
中使用 if
,例如
process :action, :if => :image?
相关: Conditional versions/process with Carrierwave
你应该尝试这样使用
class FileUploader < CarrierWave::Uploader::Base
include CarrierWave::MiniMagick
process :process_image, if: :image?
process :process_pdf, if: :pdf?
protected
def image?(new_file)
new_file.content_type.start_with? 'image'
end
def pdf?(new_file)
new_file.content_type.start_with? 'application'
end
def process_image
# I process image here
end
def process_pdf
# I process pdf here
end
end