私はユーザーにmp3のアップロードを許可しています。何らかの理由で、一部のmp3ファイルのみがアップロードされ、他のものはアップロードされません。私は作業ファイルと非作業ファイルの間に明確な違いは見当たりません。Ruby on rails。 Paperclip mp3の検証に失敗しました
class Song < ActiveRecord::Base
belongs_to :user
has_attached_file :audio, :restricted_characters => /[&$+,\/:;[email protected]<>\[\]\{\}\|\\\^~%#]/, dependent: :destroy
validates_attachment_presence :audio
validates_attachment_content_type :audio, :content_type => [ 'audio/mpeg', 'audio/mp3' ]
validates_attachment_size :audio, :less_than => 20.megabytes
end
エラーが発生したファイルのサーバー出力は、です。
Command :: file -b --mime '/tmp/acf7bcfce06ffcaa55511087ea2e486f20160427-7322-y1lyj6.mp3'
[paperclip] Content Type Spoof: Filename leyinnata.mp3 (audio/mp3 from Headers, ["audio/mpeg"] from Extension), content type discovered from file command: application/octet-stream. See documentation to allow this combination.
だから、ファイルがapplication/octet-stream
の代わりaudio/mp3
として見られていると私は理由を知りません。
私はドキュメントを読むの提案に留意し、可能な解決策が見つかりました:
paperclip.rb
Paperclip.options[:content_type_mappings] = {
:audio=> 'application/octet-stream'
}
、これは何もしませんが。 (私はサーバーを再起動しました)
なぜ動作しないのか分かりませんし、今は非常に不満を感じています。どんな助けでも感謝します、ありがとう。
UPDATE:
は、より多くのオーディオファイルの種類を指定するには、任意の違いを確認していないようです。
validates_attachment_content_type :audio, :content_type => [ 'audio/mpeg', 'audio/x-mpeg', 'audio/mp3', 'audio/x-mp3', 'audio/mpeg3', 'audio/x-mpeg3', 'audio/mpg', 'audio/x-mpg', 'audio/x-mpegaudio' ]
私もvalidates_attachment_content_type
などにapplication/octet-stream
を追加しようとしています。
validates_attachment_content_type :audio, :content_type => [ 'application/octet-stream', 'audio/mpeg', 'audio/x-mpeg', 'audio/mp3', 'audio/x-mp3', 'audio/mpeg3', 'audio/x-mpeg3', 'audio/mpg', 'audio/x-mpg', 'audio/x-mpegaudio' ]
いいえ運がありません。
私は誰かが自分のenvironment.rbのファイルに
Paperclip.options[:content_type_mappings] = {
audio: "application/octet-stream"
}
を追加しました。これは私にとってもうまくいかない。
UPDATE 2:paperclip.rbで
、追加:
module Paperclip
# do not require any validations
REQUIRED_VALIDATORS = []
# do not complain when missing validations
class Attachment
def missing_required_validator?
false
end
end
# skip media type spoof detection
module Validators
class MediaTypeSpoofDetectionValidator < ActiveModel::EachValidator
def validate_each(record, attribute, value)
true
end
end
end
end
は私が必要なものをアップロードすることができますが、これはなりすましの検証をスキップして、私は危険な可能性が想像してみてください。私のユーザーは、ウェブサイトの別の部分に画像をアップロードすることも許可されています。私は今、攻撃することができないと知っています。
UPDATE 3:
私は私のpaperclip.rb
に
module Paperclip
class MediaTypeSpoofDetector
def spoofed?
false
end
end
end
を追加しました。これは正常に動作しているようです。もし誰かがより良い解決策を考え出すことができたら、私は自分の質問に答えるでしょう。
Worked!また、Rails4 with paperclip 4.x –