纸夹 - 如何上传PDF文件?

4

我有一个模型,可以将图像和pdf上传到亚马逊S3 - 图像可以正常工作,但pdf无法工作。

这是我的模型:

validates_attachment_content_type :photo, :content_type => ['image/jpeg', 'image/png', 'image/gif']
has_attached_file :pdf,
    :storage => :s3,
    :s3_credentials => "#{::Rails.root.to_s}/config/s3.yml",
    :path => "/userpdfs/:id/:basename.:extension"
has_attached_file :photo,
    :styles => {:medium => "200x300>", :thumb => "100x150>" },
    :storage => :s3,
    :s3_credentials => "#{::Rails.root.to_s}/config/s3.yml",
    :path => "/userphotos/:style/:id/:basename.:extension"

亚马逊正在显示用户照片,但没有用户PDF文档。这两种类型在我的数据库中都有四个字段:

pdf_name
pdf_type # could also be a word doc
pdf_size
pdf_updated_at
  1. 为什么简历无法上传(图片可以)?
  2. 如何验证 :pdf 字段只允许 .pdf、.doc、.docx、.txt 格式的文件?

编辑

向 :pdf 字段上传任何图像都可以!但是似乎 PDF 文件本身会破坏系统。我的服务器显示已将文件保存到 S3,但它们不会出现在目录中。

现在,PDF 只有在标题中没有空格的情况下才能正常工作。如果标题中有空格,则会出现以下错误:Errno::EPIPE: Broken Pipe


您可以通过将文件名用双引号括起来来允许文件名中包含空格。 - hwrd
我觉得最好使用CGI.escape(str)来处理空格。 - Yuri Sidorov
3个回答

5

试试这个

>> Attachment.last.file_path
=> "https://s3.amazonaws.com/content.dynamixccw.com/attachments/4/Financial goal Report.pdf"
>> url = _
=> "https://s3.amazonaws.com/content.dynamixccw.com/attachments/4/Financial goal Report.pdf"
>> url.gsub(' ', '%20')
=> "https://s3.amazonaws.com/content.dynamixccw.com/attachments/4/Financial%20goal%20Report.pdf"

要进行验证,请将以下内容放入:

validates_attachment_content_type :pdf, :content_type => ['application/pdf', 'application/msword', 'text/plain'], :if => :pdf_attached?

def pdf_attached?
  self.pdf.file?
end

我在我的模型中使用了validates_attachment_content_type :pdf_file, :content_type => ['application/pdf'],:message => "只允许上传PDF文件",但它没有起作用。有什么想法吗?我也尝试了presence_of并且它可以工作。 - Sachin Prasad
尝试使用 :content_type => ["application/pdf", "application/x-pdf"] - Michael De Silva
仍然没有错误:请检查一下,我已经在stackoverflow上提出了一个问题http://stackoverflow.com/questions/17426831/pdf-fileupload-validation-not-working-using-client-side-validation-gem-in-rails - Sachin Prasad

1

为了上传PDF文档,您只需执行以下操作:

在您的模型中输入以下内容即可:

validates_attachment_content_type :uploaded_file, :content_type =>['application/pdf']

这对我有效,希望能对你有所帮助,祝一切顺利。


我在我的模型中使用了validates_attachment_content_type :pdf_file, :content_type => ['application/pdf'],:message => "只允许上传PDF文件",但它没有起作用。有什么想法吗?我也尝试了presence_of并且它有效。 - Sachin Prasad

1
'application/pdf'添加到您的:content_type中,使其变为:content_type => ['image/jpeg', 'image/png', 'image/gif','application/pdf']。这样应该就可以解决问题了,如果您想在应用程序内打开它,还需要添加'application/octet-stream',对于MSword/spreadsheet,请添加'application/msword'

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接