2011-11-11 2 views
3

내 레일 앱에서 Office 2007 문서 (pptx, xlsx, docx)를 식별하는 데 문제가 있습니다. 그것은 application/zip mime-type과 함께 paperclip을 통해 업로드됩니다.레일 3 클립 클립 마임 유형 - Office 2007

내 시스템 (OSX Lion)에서도 파일이 zip으로 감지됩니다.

[email protected]:~$ file --mime -b test.docx 
application/zip; charset=binary 

것은 내가 내 이니셜 라이저/mime_types

Rack::Mime::MIME_TYPES.merge!({ 
    ".docx"  => "application/vnd.openxmlformats-officedocument.wordprocessingml.document" 
}) 

하지만 행운과

에 다음을 추가 시도했습니다.

아이디어가 있으십니까?

답변

1

이것은 브라우저마다 다릅니다. 마임 유형은 브라우저에 의해 컨텐츠 유형으로 설정됩니다. 이는 브라우저 구현 및 클라이언트 시스템에 존재할 수있는 클라이언트 측 MIME 유형 설정에 따라 다릅니다.

마임 유형 (콘텐츠 유형)만으로는 문서 유형을 확인하는 것이 신뢰할 수 없다는 결론에 도달했습니다. MIME 형식과 파일 확장명을 검사해야합니다. 파일 확장자만으로도 그다지 신뢰할 수는 없지만 두 파일의 결합이 합리적으로 실행 가능할 수 있습니다.

슬프게도, 상자에서 나온 문서 클립은 파일 확장명에 의한 유효성 검사를 지원하지 않으므로 사용자 지정 코드가 필요합니다. 여기에 사용자 지정 유효성 검사와 같은 해낸 것입니다 :

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 

경우 VALID_UPLOAD_FILE_CONTENT_TYPESVALID_UPLOAD_FILE_EXTENSIONS은 우리가 초기화에서 정의한 두 개의 배열입니다. 우리의 첨부 파일을 "파일"이라고 부릅니다.

아마도 이와 비슷한 내용이 풀 요청으로 Paperclip gem에 추가 될 수 있습니다. 시간을 찾아 볼게.

업데이트 (12/23/2011) @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)) 

.

+0

감사합니다. 유효성 검사를 처리합니다. 다운로드시 Content-Disposition을 어떻게 변경합니까? (Docx 파일은 나를 위해 .zip 파일로 다운로드) – Jamsi

+0

@ 잠씨 환영합니다. 답을 원한다면 받아들이십시오. (왼쪽의 큰 체크 표시를 누르십시오) - 여기 두 점수 모두 도움이 될 것입니다. [faq # 평판]을 참조하십시오. 다운로드와 관련하여, 주석 필드의 코드를 제대로 포맷 할 수 없기 때문에 대답을 업데이트하고 있습니다. –