2010-07-19 63 views
0

我找到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 
+0

你能提供你的建议应用程序的更多细节。你想用Imageshack做些什么?如果是这样,什么? – bjg 2010-07-19 10:51:06

+0

对不起,应该包括那个。是的,我希望用户能够使用Imageshack API上传图像。 – ben 2010-07-19 12:21:29

回答

1

这不是一个帮助文件,它是一个库文件。所以,如果你想使用它,你可以把它放在lib文件夹中。

2

使用信息似乎很简单。

pic_online = ShackMirror.new(local_path_of_pic) 
pic_online.url 

该代码的目的似乎是将本地图像文件上载到imageshack,并在完成后返回图像的URL。第一行进行图片上传,第二行返回图片的网址。

您似乎需要额外的唯一东西是通过更新SHACK_ID常量来将您的图像小屋ID放入课程中。

+0

谢谢你。我将ShackMirror.rb文件放在助手文件夹中吗? – ben 2010-07-19 11:29:52