2013-07-10 1 views
2

Fog 및 Amazon S3와 함께 비디오 및 이미지 파일을 관리하고 있습니다. 나는 내 파일에 대해 content_type을 설정하는 데 많은 어려움을 겪고있다.안개 저장 파일의 content_type을 s3에 설정하십시오.

콘솔에서 작업 할 때 각 파일의 content_type을 개별적으로 업데이트 한 다음 저장을 실행할 수 있습니다. 그러나 특정 디렉토리 내의 모든 파일에 대한 업데이트를 실행하려고하면 오류가 발생하지 않지만 아무것도 업데이트되지 않습니다. 저는 여러 가지 다른 방법을 실행했습니다. 모두 같은 기본 아이디어를 가지고 있으며, 모두 "저장되었습니다!"라고 인쇄했습니다. 파일이 저장되면. 메소드가 제대로 실행되고 "saved!"가 출력되지만, 다시 돌아가서 파일을 검사하면 content_type은 여전히 ​​nil입니다. 나는이 작품을 저장, 각각의 파일을 업데이트를 통해 개별적으로 갈 때, 또한

directory.files.each do |f| 
    case f.key.split(".").last 
    when "jpg" 
    f.content_type = "image/jpeg" 
    puts "saved!" if f.save 
    when "mov" 
    f.content_type = "video/quicktime" 
    puts "saved!" if f.save 
    end 
end 

과 콘텐츠 _가 업데이트됩니다,하지만 데이터는 유지되지 않습니다

는 여기에 내가 뭘하는지의 예입니다. 예를 들어

: 나는 AWS에서 파일을 확인 갈 때

file = directory.files.first 
file.content_type = 'video/quicktime' 
file.save   # returns true 
file.content_type # returns 'video/quicktime' 

것은 그러나, 콘텐츠 유형은 아직 전무하다.

Fog s3 파일에서 content_type을 업데이트하는 방법이 더 좋습니까? 나는 이것이 틀린 길로 가야만하는 것처럼 느껴진다. 업데이트

:

directory.files.each do |f| 
    content_type = case f.key.split(".").last 
    when "jpg" 
    "image/jpeg" 
    when "mov" 
    "video/quicktime" 
    end 
    puts "copied!" if f.copy(f.directory.key, f.key, { 'Content-Type' => content_type }) 
end 

나는 오류가 있어요 : 파일 #을 사용하여 시도 이 방법은 복사 그냥 메타 데이터 (그리고 신체/콘텐츠 자체를) 업데이트하는 경우

Excon::Errors::BadRequest: Expected(200) <=> Actual(400 Bad Request) 

from /Users/marybethlee/.rvm/gems/[email protected]/gems/excon-0.22.1/lib/excon/middlewares/expects.rb:6:in `response_call' 
from /Users/marybethlee/.rvm/gems/[email protected]/gems/excon-0.22.1/lib/excon/connection.rb:355:in `response' 
from /Users/marybethlee/.rvm/gems/[email protected]/gems/excon-0.22.1/lib/excon/connection.rb:249:in `request' 
from /Users/marybethlee/.rvm/gems/[email protected]/gems/fog-1.11.1/lib/fog/core/connection.rb:21:in `request' 
from /Users/marybethlee/.rvm/gems/[email protected]/gems/fog-1.11.1/lib/fog/aws/storage.rb:506:in `request' 
from /Users/marybethlee/.rvm/gems/[email protected]/gems/fog-1.11.1/lib/fog/aws/requests/storage/copy_object.rb:33:in `copy_object' 
from /Users/marybethlee/.rvm/gems/[email protected]/gems/fog-1.11.1/lib/fog/aws/models/storage/file.rb:93:in `copy' 
from (irb):14 
from /Users/marybethlee/.rvm/rubies/ruby-2.0.0-p0/bin/irb:16:in `<main>' 

답변

5

당신을 저장 대신 사본을 사용하려고합니다. 이것은 아마 명백하지는 않지만, 그것은 S3 쪽에서 작업을 유지하므로 훨씬 빠릅니다.

같은 사본의 서명은 같습니다

directory.files.each do |f| 
    content_type = case f.key.split(".").last 
    when "jpg" 
    "image/jpeg" 
    when "mov" 
    "video/quicktime" 
    end 
    options = { 
    'Content-Type' => content_type, 
    'x-amz-metadata-directive' => 'REPLACE' 
    } 
    puts "copied!" if f.copy(f.directory, f.key, options) 
end 

기본적 S3를 얘기해야 그 "복사 :

copy(target_directory_key, target_file_key, options = {})

그래서 내가 제안 된 솔루션이이 같은 (어느 정도)를 찾아야한다 생각 내 파일 자체의 상단에 있지만이 헤더를 변경 ". 그렇게하면 파일을 다운로드하거나 다시 업로드 할 필요가 없습니다. 이것은 아마도 당신이 원하는 접근 방식 일 것입니다.

솔루션을 제외하면 여전히 버그를 발견 한 것 같습니다. "개별적으로 각 파일을 업데이트"한다는 의미의 예를 포함시킬 수 있습니까? 단지 당신이 의미하는 바를 정확하게 알고 싶습니다. 그리고 나는 일하는 것과 그렇지 않은 것을 동시에 볼 수 있습니다. 또한, 어떻게/왜 콘텐츠 유형을 업데이트하지 않고 있다고 생각합니까? (실제로 업데이트 할 수도 있지만 업데이트 된 값을 정확하게 표시하지 않는지 등)file.key는 이름이

directory.files.head(file.key).content_type

입니다 :

+0

그래서 난 당신이 무엇을 제안했지만 오류가있어 : 를'Excon :: 오류 :: BadRequest : 예상 실제 (200) <=> (400 잘못된 요청)이' 내가 오류를 포함하도록 내 원래의 게시물을 수정할 수 있습니다, 개인 업데이트로 의미 한 것의 예뿐만 아니라 – oolong

+0

업데이트 주셔서 감사합니다. 적어도 하나의 문제가 발견되었습니다 (기본적으로 이전 메타 데이터를 사용하고 복사 요청에서 전달 된 내용을 무시하므로 'REPLACE'를 지정해야한다는 것을 간과했습니다). 또한 오류에 대해 좀 더 자세하게 설명하면 편리 할 것입니다. 안개 버전을 업데이트하고 다시 시도해 주시겠습니까? 나는 그것이 그것을 고칠 것이라는 것을 모른다, 그러나 적어도 조금 더 상세한 오류 메시지를 제공해야한다. 감사! – geemus

+1

아하! 옙 지정은 오류를 수정했지만 여전히 이전에 실행했던 것과 같은 문제입니다. 루프를 통해 복사 된 내용이 인쇄되지만 콘텐츠 유형은 여전히 ​​모든 파일에 대해 nil이며 개별적으로 업데이트하면 제대로 작동하는 것처럼 보일 수 있지만 aws가되지는 않습니다. – oolong

0

https://github.com/fog/fog/issues?state=open 내가 콘텐츠 형식을 얻기 위해이 해결 방법을 발견 : 당신이 여기에 문제를 만들 수 있습니다 경우 보너스 포인트가 확실히 나는 그것을 해결하는 것을 잊지 마세요 만들려면 파일의

관련 문제