【问题标题】:Post png image to pngcrush with Ruby使用 Ruby 将 png 图像发布到 pngcrush
【发布时间】:2015-06-13 16:17:21
【问题描述】:

在 ruby​​ 中,我想得到与下面的代码相同的结果,但不使用 curl:

curl_output = `curl -X POST -s --form "input=@#{png_image_file};type=image/png" http://pngcrush.com/crush >  #{compressed_png_file}`

我试过这个:

#!/usr/bin/env ruby
require "net/http"
require "uri"

# Image to crush
png_image_path = "./media/images/foo.png"

# Crush with http://pngcrush.com/
png_compress_uri = URI.parse("http://pngcrush.com/crush")
png_image_data = File.read(png_image_path)
req = Net::HTTP.new(png_compress_uri.host, png_compress_uri.port)
headers = {"Content-Type" => "image/png" }
response = req.post(png_compress_uri.path, png_image_data, headers)

p response.body
# => "Input is empty, provide a PNG image."

【问题讨论】:

    标签: ruby http post png


    【解决方案1】:

    您的代码的问题是您没有向服务器发送所需的参数(http://pngcrush.com/crush 的“输入”)。这对我有用:

    require 'net/http'
    require 'uri'
    
    uri = URI.parse('http://pngcrush.com/crush')
    
    form_data = [
      ['input', File.open('filename.png')]
    ]
    
    http = Net::HTTP.new(uri.host, uri.port)
    request = Net::HTTP::Post.new uri
    
    # prepare request parameters
    request.set_form(form_data, 'multipart/form-data')
    response = http.request(request)
    
    # save crushed image
    open('crushed.png', 'wb') do |file|
      file.write(response.body)
    end
    

    但我建议你使用RestClient。它用多部分表单数据等很酷的特性封装了 net/http,你只需要几行代码就可以完成这项工作

    require 'rest_client'
    
    resp = RestClient.post('http://pngcrush.com/crush',
      :input => File.new('filename.png'))
    
    # save crushed image
    open('crushed.png', 'wb') do |file|
      file.write(resp)
    end
    

    gem install rest-client安装它

    【讨论】:

    • 它有效,而且绝对比拨打curl 更好。这就是为什么我接受你的回答。但是,我仍然希望有人会仅使用 Ruby Core 给出答案。
    • @standelaune 谢谢!我可以用纯net/http 做同样的事情。答案已更新。
    猜你喜欢
    • 1970-01-01
    • 2017-01-05
    • 2015-12-21
    • 1970-01-01
    • 2018-02-11
    • 2015-03-01
    • 2015-04-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多