我找到this Ruby code來幫助在CodeSnippets上使用Imageshack API。我是Ruby on Rails的新手,所以我知道如何使用模型,視圖和控制器,但我不確定如何使用此代碼。它會是一個模塊嗎?謝謝閱讀。如何使用此Ruby代碼?
用法:
pic_online = ShackMirror.new(local_path_of_pic)
pic_online.url#=>返回上ImageShack的直接 鏈路。
require 'rubygems'
require 'hpricot'
require 'net/http'
require 'uri'
require 'cgi'
require 'mime/types'
class ShackMirror
SHACK_ID = "REPLACE WITH YOUR OWN IMAGESHACK ID"
USER_AGENT = "Mozilla/5.0 (Macintosh; U; Intel Mac OS X; en) AppleWebKit/419 (KHTML, like Gecko) Safari/419.3"
BOUNDARY = '----------PuSHerInDaBUSH_$'
attr_reader :url
def initialize(img)
raise NonImageTypeError, 'Expected image file.' unless img =~ /jpe?g|png|gif|bmp|tif|tiff|swf$/
@img = img
@url, @hosturi, @res = "","",""
@header, @params = {}, {}
@header['Cookie'] = "myimages=#{SHACK_ID}"
@header['User-Agent'] = USER_AGENT
@params['uploadtype'] = 'on'
@params['brand'] = ''
@params['refer'] = ''
@params['MAX_FILE_SIZE'] = '13145728'
@params['optimage'] = '0'
@params['rembar'] = '1'
transfer
getdirect
end
protected
def prepare_multipart (params)
fp = []
params.each do |k,v|
if v.respond_to?(:read)
fp.push(FileParam.new(k,v.path,v.read))
else fp.push(Param.new(k,v))
end
end
query = fp.collect {|p| "--" + BOUNDARY + "\r\n" + p.to_multipart }.join("") + "--" + BOUNDARY + "--"
return query
end
def prepFile(path_to_file)
file = File.new(path_to_file)
@header['Content-Type'] = "multipart/form-data, boundary=" + BOUNDARY + " "
@params['url'] = 'paste image url here'
@params['fileupload'] = file
$query = prepare_multipart(@params)
file.close
end
def locate(path)
path !~ /^http/ ? "local" : "remote"
end
def upload(query, headers={})
Net::HTTP.start(@hosturi.host) do | http |
http.post(@hosturi.path, query, headers);
end
end
def transload(url)
@header['Content-Type'] = 'form-data'
@params['url'] = url
@params['fileupload'] = ''
postreq = Net::HTTP::Post.new(@hosturi.path, @header)
postreq.set_form_data(@params)
return Net::HTTP.new(@hosturi.host, @hosturi.port).start { |http| http.request(postreq) }
end
def transfer
case locate(@img)
when "local"
@hosturi = URI.parse('http://load.imageshack.us/index.php')
prepFile(@img)
@res = upload($query,@header)
when "remote"
@hosturi = URI.parse('http://imageshack.us/transload.php')
@res = transload(@img)
end
end
def getdirect
doc = Hpricot(@res.body)
@url = (doc/"//input").last['value']
end
end
class Param
attr_accessor :k, :v
def initialize(k, v)
@k = k
@v = v
end
def to_multipart
return "Content-Disposition: form-data; name=\"#{CGI::escape(k)}\"\r\n\r\n#{v}\r\n"
end
end
class FileParam
attr_accessor :k, :filename, :content
def initialize(k, filename, content)
@k = k
@filename = filename
@content = content
end
def to_multipart
return "Content-Disposition: form-data; name=\"#{CGI::escape(k)}\"; filename=\"#{filename}\"\r\n" +
"Content-Type: #{MIME::Types.type_for(@filename)}\r\n\r\n" + content + "\r\n"
end
end
你能提供你的建議應用程序的更多細節。你想用Imageshack做些什麼?如果是這樣,什麼? – bjg 2010-07-19 10:51:06
對不起,應該包括那個。是的,我希望用戶能夠使用Imageshack API上傳圖像。 – ben 2010-07-19 12:21:29