2012-06-13 5 views
1

나는 우분투에서 내 레일 애플 리케이션에 일부 엑셀 파일을 구문 분석하는 데 사용하고 있습니다. 이것들은 Carrierwave와 함께 업로드됩니다. 공공/업로드에컨트롤러에서 Errno :: EACCES 업로드 우분투에서 레일로 캐리어 웨이브

excelx_file = params[:excel_file] 
filex = MetadataUploader.new 
filex.store!(excelx_file) 
workbook = Excelx.new("#{filex.store_path}") 
다음

있는 권한 :

drwxrwxr-x 2 pirames pirames 4096 Jun 13 14:03 metadata_ingestion 
drwxrwxr-x 2 pirames pirames 4096 Jun 13 14:24 tmp 
다음

있는 파일에 대한 권한 : 여기

ls -l public/uploads/metadata_ingestion/ 
total 608 
-rw-r--r-- 1 pirames pirames 621504 Jun 13 14:24 Bozza_Pirames_Distribuito.xlsx 

여기

내 실제 컨트롤러 라인이다 대신 실제 추적입니다 :

이제 동일한 코드 내 맥에 디바이스에서 완벽하게 작동 https://github.com/hmcgowan/roo/blob/master/lib/roo/excelx.rb

에 @filename = 파일 이름

:

Errno::EACCES in IngestionController#upload 

Permission denied - oo_2895_1872934321 
Rails.root: /var/www/mascarino 

Application Trace | Framework Trace | Full Trace 
/home/pirames/.rvm/rubies/ruby-1.9.3-p194/lib/ruby/1.9.1/fileutils.rb:247:in `mkdir' 
/home/pirames/.rvm/rubies/ruby-1.9.3-p194/lib/ruby/1.9.1/fileutils.rb:247:in `fu_mkdir' 
/home/pirames/.rvm/rubies/ruby-1.9.3-p194/lib/ruby/1.9.1/fileutils.rb:176:in `block in mkdir' 
/home/pirames/.rvm/rubies/ruby-1.9.3-p194/lib/ruby/1.9.1/fileutils.rb:175:in `each' 
/home/pirames/.rvm/rubies/ruby-1.9.3-p194/lib/ruby/1.9.1/fileutils.rb:175:in `mkdir' 
roo (1.10.1) lib/roo/excelx.rb:95:in `initialize' 
app/controllers/ingestion_controller.rb:24:in `new' 
app/controllers/ingestion_controller.rb:24:in `upload' 
actionpack (3.2.3) lib/action_controller/metal/implicit_render.rb:4:in `send_action' 
actionpack (3.2.3) lib/abstract_controller/base.rb:167:in `process_action' 
actionpack (3.2.3) lib/action_controller/metal/rendering.rb:10:in `process_action' 

오류를 던지기 전에이라고 루에 실제 라인은 다음과 같다. 실행중인 서버는 dev에 우분투에 퓨마입니다. 사용 권한을 확인한 결과 내 Mac이 동일합니다. 폴더를 소유 한 사용자가 서버를 실행하는 것과 동일한 지 확인했습니다.

아이디어가 있으십니까? 내가 놓친 게 있니?

편집은 : 나는 또한 추적에 오류 메시지가 나타났습니다 :

Permission denied - oo_2895_1872934321 

2895

는 푸마 서버가 실행의 PID입니다. # {filex.store_path} 대신 업로드 된 파일의 실제 경로를 전달하면 결과는 변경되지 않습니다.

감사합니다.

+0

나는 이것을위한 대답을 가지고 있다고 생각한다 : from : http : //roo.rubyforge.org/ 이 보석의 임시 파일은 'oo_'로 이름이 지정된 디렉토리에 저장되며 숫자 (현재 프로세스의 PID)는 입니다. 이 디렉토리는 현재 작업 디렉토리 내에 작성됩니다. 임시 파일에 다른 디렉토리를 사용하려면 환경 변수 ROO_TMP를 설정하십시오! (예 :의 경우 .bashrc 파일에서 "export ROO_TMP =/tmp"). ROO_TMP는 1.1.0 이상 릴리스에서 도입되었습니다. – Hiromichan

답변

1

예! 내 가정은 옳았다. ...

내가 보았다 : https://github.com/hmcgowan/roo/blob/master/lib/roo/excelx.rb 엑셀 파일을 처리 할 때 루가 무엇을하는지 알아 보았다. 그래서 내가 알아 낸 것입니다 : ENV [ 'ROO_TMP를'] 호출 @tmpdir

def initialize(filename, packed=nil, file_warning = :error) #, create = false) 
super() 
@file_warning = file_warning 
@tmpdir = "oo_"+$$.to_s 
@tmpdir = File.join(ENV['ROO_TMP'], @tmpdir) if ENV['ROO_TMP'] 
unless File.exists?(@tmpdir) 
    FileUtils::mkdir(@tmpdir) 
end 
filename = open_from_uri(filename) if filename[0,7] == "http://" 
filename = unzip(filename) if packed and packed == :zip 

. ROO_TMP는 roo의 1.1.0보다 많은 릴리스에서 도입되었습니다. 이것이 이전에 작동했던 이유입니다.

제 경우 ENV [ 'ROO_TMP']는 nil을 리턴합니다.

그래서 ROO_TMP =/var/www/tmp를 테스트 해 보았습니다. 그런 다음 chown -R username/var/www/tmp.

그리고 지금은 :

1.9.3p194 :001 > ENV['ROO_TMP'] 
=> "/var/www/tmp" 

이 모든 것이 작동하게하고 나는 나에게 내 파일 :

명예를 처리 할 수 ​​있었다!

+1

모든 사람의 개요 목록에 대한 질문을 "대답 함"으로 설정하려면 자신의 대답도 수락하십시오. –

+0

나는 아직도 여기 멍청하다. 나는 내일 그렇게 할 수있다. ... – Hiromichan

+0

죄송하지만, 나는 그 한계에 대해 몰랐다. –