문제

나는 대용량 바이너리 파일에 대한 지원이 필요한 프로젝트를 곧 시작할 예정입니다.웹앱에 Ruby on Rails를 사용하고 싶지만 BLOB 지원이 걱정됩니다.다른 언어, 프레임워크 및 데이터베이스에 대한 내 경험에 따르면 BLOB는 종종 간과되어 기능이 열악하고 어렵고/또는 버그가 있습니다.

RoR은 BLOB를 적절하게 지원합니까?이미 Rails에 전념하고 나면 갑자기 발생하는 문제가 있나요?

지금:PostgreSQL 및/또는 MySQL을 백엔드 데이터베이스로 사용하고 싶습니다.당연히 기본 데이터베이스의 BLOB 지원이 중요합니다.지금은 DB의 BLOB 기능에 집중하는 것을 피하고 싶습니다.나는 Rails 자체가 어떻게 반응하는지에 더 관심이 있습니다.이상적으로 Rails는 데이터베이스의 세부사항을 나에게 숨겨야 하고, 그래서 나는 한 데이터베이스에서 다른 데이터베이스로 전환할 수 있어야 합니다.이것이라면 ~ 아니다 사건(예:특정 DB에서 Rails를 사용하는 데 문제가 있는 경우) 이에 대해 언급해 주세요.

업데이트:또한 여기서는 ActiveRecord에 대해서만 이야기하는 것이 아닙니다.HTTP 측에서 바이너리 파일을 처리해야 합니다(파일 업로드를 효과적으로 수행).이는 Rails를 통해 적절한 HTTP 헤더와 스트림에 액세스하는 것을 의미합니다.이를 반영하기 위해 질문 제목과 설명을 업데이트했습니다.

도움이 되었습니까?

해결책

attachment_fu의 경우 +1

나는 내 앱 중 하나에서 attachment_fu를 사용하고 파일을 DB에 저장해야 합니다(이 대화의 범위를 벗어나는 성가신 이유로).

내가 발견한 BLOB 관련 까다로운 점은 데이터를 사용자에게 보내기 위해 별도의 코드 경로가 필요하다는 것입니다. 원하는 것처럼 파일 시스템에 경로를 인라인으로 삽입할 수는 없습니다. 일반 제인 파일이었습니다.

예를 들어아바타 정보를 저장하는 경우 간단히 다음을 수행할 수 없습니다.

<%= image_tag @youruser.avatar.path %>

래퍼 로직을 작성하고 send_data를 사용해야 합니다.(아래는attachment_fu가 포함된 예시일 뿐입니다. 실제로는 이를 DRY해야 합니다.)

send_data(@youruser.avatar.current_data, :type => @youruser.avatar.content_type, :filename => @youruser.avatar.filename, :disposition => 'inline' )

불행하게도 제가 아는 한 attachment_fu(최신 버전이 없습니다)는 여러분을 위해 영리하게 래핑을 수행하지 않습니다. 여러분이 직접 작성해야 합니다.

추신질문 편집 내용을 보면 Attachment_fu는 DB에 저장할 때 발생하는 작은 문제를 제외하고 파일 경로를 알아야 하는 것과 관련된 모든 귀찮은 작업을 처리합니다.시도 해봐;Rails 앱의 표준입니다.바퀴를 재발명해야 한다면 attachment_fu의 소스 코드에 대부분의 문제점도 문서화되어야 합니다!

다른 팁

스트리밍의 경우 (적어도 메모리 측면에서는) 효율적인 방식으로 모든 작업을 수행할 수 있습니다.업로드 측면에서 양식의 파일 매개변수는 읽을 수 있는 IO 개체로 추상화됩니다.다운로드 측면에서 다음 형식을 살펴보십시오. render :text => Proc 인수를 사용합니다.

render :content_type => 'application/octet-stream', :text => Proc.new {
    |response, output|
    # do something that reads data and writes it to output
}

하지만 귀하의 콘텐츠가 디스크의 파일에 있는 경우 앞서 언급한 솔루션이 확실히 더 잘 작동할 것입니다.

당신은 사용할 수 있습니다 :binary ActiveRecord 마이그레이션을 입력하고 최대 크기도 제한합니다.

class BlobTest < ActiveRecord::Migration
  def self.up
    create_table :files do |t|
      t.column :file_data, :binary, :limit => 1.megabyte
    end
  end
end

ActiveRecord는 BLOB(또는 CLOB) 콘텐츠를 Ruby 문자열로 노출합니다.

내 생각에 가장 좋은 방법은 attachment_fu 플러그인입니다.http://github.com/technoweenie/attachment_fu/tree/master

업데이트:여기에서 추가 정보를 찾았습니다. http://groups.google.com/group/rubyonrails-talk/browse_thread/thread/a81beffb93708bb3

플러그인을 살펴보고, x_send_file 도.

"XSendFile 플러그인은 X-Sendfile HTTP 헤더를 통해 파일을 보내기 위한 간단한 인터페이스를 제공합니다.이를 통해 웹 서버는 Rails 프로세스를 통해 파일을 스트리밍하는 대신 디스크에서 직접 파일을 제공할 수 있습니다.Mongrel을 사용하는 경우 이는 더 빠르고 많은 메모리를 절약합니다.모든 웹 서버가 이 헤더를 지원하는 것은 아닙니다.YMMV."

Blob에서 사용할 수 있는지 확실하지 않습니다. 파일 시스템의 파일에만 사용할 수 있습니다.그러나 아마도 많은 양의 데이터를 스트리밍하는 웹 서버를 묶지 않는 것이 필요할 것입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top