2010-04-21 34 views
16

Tôi đang cố gắng tải lên tệp bằng Sinatra. Tôi có mã số here, nhưng tôi nhận được lỗi "phương pháp file_hash không tồn tại" (xem /lib/mvc/helpers/helpers.rb).Tải lên tệp bằng Sinatra

Điều gì đang xảy ra ở đây? Có một số phụ thuộc tôi đang thiếu.

+0

Tôi giả sử bạn đang cố sử dụng kẹp giấy với điều này. Bạn có thể dán lại mã của mình không (liên kết dẫn đến trang đã chết)? Nếu không, giải pháp của bạn là gì? – slant

Trả lời

27

Tôi đã may mắn với mã ví dụ được tìm thấy trên this thread.

Bao gồm nó ở đây trong trường hợp liên kết bao giờ biến mất:

post '/upload' do 
    unless params[:file] && 
     (tmpfile = params[:file][:tempfile]) && 
     (name = params[:file][:filename]) 
    @error = "No file selected" 
    return haml(:upload) 
    end 
    STDERR.puts "Uploading file, original name #{name.inspect}" 
    while blk = tmpfile.read(65536) 
    # here you would write it to its final location 
    STDERR.puts blk.inspect 
    end 
    "Upload complete" 
end 

Sau đó xem bạn sẽ trông như thế này. Này sử dụng HAML, nhưng phần quan trọng không phải là để quên đặt enctype trong yếu tố hình thức của bạn, nếu không bạn sẽ chỉ nhận được tên tập tin thay vì một đối tượng:

%form{:action=>"/upload",:method=>"post" ,:enctype=>"multipart/form-data"} 
    %input{:type=>"file",:name=>"file"} 
    %input{:type=>"submit",:value=>"Upload"} 
20
include FileUtils::Verbose 

get '/upload' do 
    erb :upload 
end 

post '/upload' do 
    tempfile = params[:file][:tempfile] 
    filename = params[:file][:filename] 
    cp(tempfile.path, "public/uploads/#{filename}") 
    'Yeaaup' 
end 

__END__ 

@@upload 
<form action='/upload' enctype="multipart/form-data" method='POST'> 
    <input name="file" type="file" /> 
    <input type="submit" value="Upload" /> 
</form> 
4

tôi thấy, hơi thay đổi và sử dụng này:

if params[:file] 
    filename = params[:file][:filename] 
    tempfile = params[:file][:tempfile] 
    target = "public/files/#{filename) 

    File.open(target, 'wb') {|f| f.write tempfile.read } 
end 

Bản gốc ở số https://github.com/tbuehlmann/sinatra-fileupload nhưng có một số vấn đề về cấu hình trong môi trường của tôi. Đừng quên sử dụng enctype="multipart/form-data"method='POST' ở biểu mẫu tải lên.

+0

Trong trường hợp của tôi, tôi thấy rằng khóa băm đầu tiên là một chuỗi - không phải là một biểu tượng - ví dụ. 'params ['file']' –

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