복붙노트

[RUBY-ON-RAILS] 루비에 업로드 된 파일의 MIME 유형을 감지

RUBY-ON-RAILS

루비에 업로드 된 파일의 MIME 유형을 감지

루비 레일에 루비에 업로드 된 파일의 MIME 유형을 감지하는 총알 증거 방법이 있습니까? 나는 SWFupload을 사용하여 JPEG 파일과 PNG 파일을 업로드하고있어 콘텐츠 _ 항상 "응용 프로그램 / octet-stream을"입니다

해결법

  1. ==============================

    1.루비 - filemagic 보석은 그것을 할 것입니다 :

    루비 - filemagic 보석은 그것을 할 것입니다 :

    require 'filemagic'
    
    puts FileMagic.new(FileMagic::MAGIC_MIME).file(__FILE__)
    # => text/x-ruby; charset=us-ascii
    

    이 보석은 전혀 파일 확장자에 보이지 않는다. 이 파일의 형식을 추측 할 수있는 파일의 내용 및 용도의 비트를 읽습니다.

  2. ==============================

    2.루비 온 레일즈 당신은 할 수 있습니다 :

    루비 온 레일즈 당신은 할 수 있습니다 :

    MIME::Types.type_for("filename.gif").first.content_type # => "image/gif"
    
  3. ==============================

    3.당신은 파일의 마법 헤더에이 신뢰할 수있는 방법베이스를 사용할 수 있습니다 :

    당신은 파일의 마법 헤더에이 신뢰할 수있는 방법베이스를 사용할 수 있습니다 :

    def get_image_extension(local_file_path)
      png = Regexp.new("\x89PNG".force_encoding("binary"))
      jpg = Regexp.new("\xff\xd8\xff\xe0\x00\x10JFIF".force_encoding("binary"))
      jpg2 = Regexp.new("\xff\xd8\xff\xe1(.*){2}Exif".force_encoding("binary"))
      case IO.read(local_file_path, 10)
      when /^GIF8/
        'gif'
      when /^#{png}/
        'png'
      when /^#{jpg}/
        'jpg'
      when /^#{jpg2}/
        'jpg'
      else
        mime_type = `file #{local_file_path} --mime-type`.gsub("\n", '') # Works on linux and mac
        raise UnprocessableEntity, "unknown file type" if !mime_type
        mime_type.split(':')[1].split('/')[1].gsub('x-', '').gsub(/jpeg/, 'jpg').gsub(/text/, 'txt').gsub(/x-/, '')
      end  
    end
    
  4. ==============================

    4.루비 - filemagic 보석은 좋은 해결책이지만, (최근 CarrierWave에서 CarrierWave :: MagicMimeTypes 제거의 일부로 제거) libmagic에 추가 종속성을 필요로한다.

    루비 - filemagic 보석은 좋은 해결책이지만, (최근 CarrierWave에서 CarrierWave :: MagicMimeTypes 제거의 일부로 제거) libmagic에 추가 종속성을 필요로한다.

    당신이 순수 루비 구현에 관심이있는 경우, MimeMagic 보석을 고려! 그것은 freedesktop.org 마임 데이터베이스에 나열된 파일 유형에 대해 잘 작동합니다 :

    require 'mimemagic'
    
    MimeMagic.by_magic(File.open('Table-Flip-Guy.jpg')).type # => "image/jpeg" 
    

    마이크로 소프트 오피스 2007 이상 형식 (XLSX, DOCX 및 PPTX)의 경우, ( "/ 응용 프로그램 압축"일반 사용하면 않는 한있는 거 괜찮 이러한 파일의 MIME 타입) 오버레이를 필요

    require 'mimemagic'    
    require 'mimemagic/overlay'
    
    MimeMagic.by_magic(File.open('big_spreadsheet.xlsx')).type # => "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" 
    
  5. ==============================

    5.filemagic 보석은 좋은 해결책이지만 불필요한 보석을 많이 달려있다. (레일 AWS-SDK 코어, ...)

    filemagic 보석은 좋은 해결책이지만 불필요한 보석을 많이 달려있다. (레일 AWS-SDK 코어, ...)

    앱이 작고 단지 리눅스 또는 OSX에서 실행되는 경우, 파일 프로그램을 사용하여 고려하십시오

    require 'shellwords'
    mimetype = `file --brief --mime-type - < #{Shellwords.shellescape(__FILE__)}`.strip
    

    주 : EXPR과 __FILE__ 교체가 파일 경로가 포함되어 있습니다.

  6. ==============================

    6.mimemagic 보석은 그것을 할 것입니다

    mimemagic 보석은 그것을 할 것입니다

    https://github.com/minad/mimemagic

    공식 문서에서

  7. ==============================

    7.당신이 사용할 수있는

    당신이 사용할 수있는

    마임 :: Type.lookup_by_extension (extention_name)

    감사

  8. from https://stackoverflow.com/questions/4600679/detect-mime-type-of-uploaded-file-in-ruby by cc-by-sa and MIT license