2011-02-01 32 views
5

giả sử tôi muốn sử dụng curl để đặt một tập tin vào một webservice cách nàySinatra và http PUT

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

trong Sinatra tôi có thể làm:

#!/usr/bin/env ruby 

require 'rubygems' 
require 'sinatra' 

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

làm thế nào tôi có thể đọc các tập tin trực tuyến?

nhiều hơn hoặc ít hơn tôi muốn một cái gì đó như thế này: http://www.php.net/manual/en/features.file-upload.put-method.php#56985

+0

[Câu hỏi này] (http://stackoverflow.com/questions/4795205/streaming-web-uploads-to-socket-with-rack) ngụ ý rằng những gì bạn muốn không thể thực hiện được, nhưng tôi chưa biết đủ về điều này để chắc chắn đủ để đăng nó như là một câu trả lời. – Phrogz

+0

@Phrogz Tôi vừa tìm thấy điều này: http://groups.google.com/group/rack-devel/msg/600825afa08474d8 - nghĩ rằng bạn có thể quan tâm. – matt

Trả lời

4

Ví dụ cơ bản nhất đang viết nó vào thư mục currect bạn đang chạy Sinatra với không kiểm tra cho các tập tin hiện có ... chỉ clobbering họ.

#!/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 

Ngoài ra, bạn có thể bỏ phần tên tệp trong lệnh curl và điền vào tên tệp của bạn. Foe ví dụ:

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

sẽ cho kết quả bằng văn bản cho tập tin để http://localhost:4567/upload/file.txt

+0

Khối tuyến đường có chờ để chạy cho đến khi yêu cầu hoàn tất hay không, hoặc điều này có cho phép truyền trực tuyến kết quả khi chúng đến không? – Phrogz

+0

Tôi không biết về luồng ... Tôi đã bỏ lỡ chi tiết đó – 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 

Bằng cách này, bạn không phải lo lắng về kích thước của tập tin, vì anh ấy không mở (readed) trong bộ nhớ nhưng chỉ di chuyển từ thư mục tạm thời đến đúng vị trí bỏ qua một trình chặn quan trọng. Trong thực tế, mã php làm cùng một công cụ, đọc các tập tin trong khối 1k và lưu trữ trong một tập tin mới, nhưng kể từ khi tập tin của nó giống nhau, vô nghĩa của nó. Để thử bạn có thể làm theo câu trả lời của Ben.

Các vấn đề liên quan