2011-02-01 2 views
5

난 내가 할 수있는시나이 방법에게 웹 서비스에시나 및 HTTP

curl -v --location --upload-file file.txt http://localhost:4567/upload/filename 

을 파일을 넣어 컬 사용한다고 가정 PUT :

#!/usr/bin/env ruby 

require 'rubygems' 
require 'sinatra' 

put '/upload/:id' do 
    # 
    # tbd 
    # 
end 

은 내가 어떻게 스트리밍 파일을 읽을 수 있습니까? 단지 그들을 건드리지 ... 가장 기본적인 예는 기존 파일에 대한 어떤 검사와의시나를 실행하는 currect 디렉토리에 쓰고 http://www.php.net/manual/en/features.file-upload.put-method.php#56985

+0

[이 질문에] (http://stackoverflow.com/questions/4795205/streaming-web-uploads-to-socket-with-rack) 당신이 원하는 것을 할 수 없다는 것을 의미하지만, 아직 모릅니다 대답으로 게시하기에 충분할만큼 이것에 대해 충분합니다. – Phrogz

+0

@Phrogz 방금 발견 한 내용 : http://groups.google.com/group/rack-devel/msg/600825afa08474d8 - 관심 있으신가요? – matt

답변

4

:

더 많거나 적은 내가 이런 일을합니다.

#!/usr/bin/env ruby 

require 'rubygems' 
require 'sinatra' 

put '/upload/:id' do 
    File.open(params[:id], 'w+') do |file| 
    file.write(request.body.read) 
    end 
end 

또한, 당신은 컬 명령 파일 이름 부분을 생략 할 수 있으며 파일 이름으로 당신을 위해 그것을 기입합니다. 원수 예 : 그는 오픈 (읽혀질) 아니에요 이후

curl -v --location --upload-file file.txt http://localhost:4567/upload/ 

이 방법으로 http://localhost:4567/upload/file.txt

+0

요청이 완료 될 때까지 라우트 블록이 실행 대기합니까? 아니면 도착시 결과를 스트리밍 할 수 있습니까? – Phrogz

+0

나는 스트리밍에 관해 모른다. .. 나는 그 세부를 놓쳤다. – Ben

2
require 'rubygems' 
require 'sinatra' 
require 'ftools' 

put '/upload' do 
    tempfile = params['file'][:tempfile] 
    filename = params['file'][:filename] 
    File.mv(tempfile.path,File.join(File.expand_path(File.dirname(File.dirname(__FILE__))),"public","#{filename}")) 
    redirect '/' 
end 

에 파일을 쓰기가 발생합니다, 당신은 파일의 크기에 대해 걱정할 필요가 없습니다 메모리가 아니라 temp 디렉토리에서 올바른 위치로 이동하여 중요한 차단기를 건너 뜁니다. 사실, PHP 코드는 동일한 물건을하고, 1k 청크로 파일을 읽고 새로운 파일에 저장하지만, 그 이후 파일은 동일하고 무의미합니다. 시도해 보려면 Ben의 답변을 따르십시오.