2010-07-19 64 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