2011-02-01 18 views
5

Supongamos que yo quiero usar curl para poner un archivo a un servicio web de esta maneraSinatra y HTTP PUT

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

de Sinatra que puedo hacer:

#!/usr/bin/env ruby 

require 'rubygems' 
require 'sinatra' 

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

¿Cómo puedo leer el archivo de secuencias?

más o menos quiero algo como esto: http://www.php.net/manual/en/features.file-upload.put-method.php#56985

+0

[Esta pregunta] (http://stackoverflow.com/questions/4795205/streaming-web-uploads-to-socket-with-rack) implica que lo que quiere no se puede hacer, pero todavía no sabemos suficiente sobre esto para estar seguro de publicarlo como respuesta. – Phrogz

+0

@Phrogz acabo de encontrar esto: http://groups.google.com/group/rack-devel/msg/600825afa08474d8 - pensé que podría estar interesado. – matt

Respuesta

4

El ejemplo más básico es la escritura al directorio currect está ejecutando Sinatra con ningún tipo de verificación de los archivos existentes ... sólo clobbering ellos.

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

Además, se puede dejar fuera de la parte de nombre de archivo en el comando curl y va a rellenarlo para usted con el nombre de archivo. Foe ejemplo:

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

dará lugar a escribir el archivo en http://localhost:4567/upload/file.txt

+0

¿El bloque de ruta esperar para correr hasta que la solicitud haya terminado, o se relaciona este permiten la transmisión de los resultados a medida que llegan? – Phrogz

+0

No sé sobre la transmisión ... Me perdí ese detalle – 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 

De esta manera, usted no tiene que preocuparse por el tamaño del archivo, ya que no está abierto (leido) en memoria, pero simplemente se movió desde el directorio temporal a la ubicación correcta omitiendo un bloqueador crucial. De hecho, el código php hacer lo mismo, leer el archivo en trozos 1k y guardar en un archivo nuevo, pero ya que el archivo es lo mismo, su sentido. Para probar, puedes seguir la respuesta de Ben.

Cuestiones relacionadas