これはブラウザによって異なります。 MIMEタイプは、ブラウザによってコンテンツタイプとして設定されます。これは、ブラウザの実装と、クライアントマシンに存在する可能性のあるクライアント側MIMEタイプの設定によって異なります。
私は、ドキュメントタイプのチェックは、MIMEタイプ(コンテンツタイプ)だけでは信頼できないという結論に達しました。 MIMEタイプとファイル拡張子のチェックが必要です。ファイル拡張子だけではそれほど信頼性がありませんが、両方の組み合わせがおそらく合理的に実行可能になる可能性があります。
悲しいことに、Paperclipはファイル拡張子による検証をサポートしていないようですので、カスタムコードが必要です。ここで私はカスタム検証として思い付いたものです:
VALID_UPLOAD_FILE_CONTENT_TYPES
と
VALID_UPLOAD_FILE_EXTENSIONS
は、我々は初期化子で定義された2つの配列です
has_attached_file :file, ...
validate :mime_type_or_file_extension
private
def mime_type_or_file_extension
if self.file.present? &&
!VALID_UPLOAD_FILE_CONTENT_TYPES.include?(self.file_content_type) &&
!VALID_UPLOAD_FILE_EXTENSIONS.include?(Pathname.new(self.file_file_name).extname[1..-1])
self.errors.add(:file_file_name, "must be one of ." + VALID_UPLOAD_FILE_EXTENSIONS.join(' .'))
end
end
。私たちの添付ファイルは「ファイル」と呼ばれます
おそらく、このようなものがプルリクエストとしてPaperclip gemに追加される可能性があります。私は時間を見つけるかどうかわかります。
更新(2011/12/23) @Jamsiがダウンロードについて尋ねました。 @uploadは、私たちのファイル(ペーパークリップ)オブジェクトである
response.headers['Content-Disposition'] = "attachment; filename=#{@upload.file_file_name}"
response.headers['Content-Type'] = Rack::Mime.mime_type(File.extname(@upload.file_file_name))
:私たちはそうのように、コントローラにレスポンスヘッダのContent-処分とのContent-Typeを設定します。
ありがとうございます。それは検証時に処理されます。ダウンロード時にContent-Dispositionを変更するのはどうですか? (Docxファイルは私のために.zipファイルとしてダウンロードします) – Jamsi
@Jamsiようこそ。答えが好きな人は、それを受け入れてください(左の大きなチェックマークを押してください)。これは両方のスコアに役立ちます。[faq#評判]を参照してください。ダウンロードに関しては、コメントフィールドのコードを適切に書式設定できないため、答えを更新しています。 –