You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在SketchUp中通过HTTP GET/POST发送图像文件至CGI脚本?

Ruby实现本地图片上传至logoupload.pl CGI脚本

因为原HTML表单使用multipart/form-data类型的POST请求提交文件,Ruby端必须构造相同类型的请求才能兼容CGI脚本(GET请求无法传输文件内容,因此只能用POST)。以下是两种实现方案:

标准库方案(无额外依赖)

利用Ruby内置的Net::HTTP构造multipart请求,无需安装第三方gem:

require 'net/http'
require 'uri'

# 配置参数
upload_url = URI("http://design.medeek.com/resources/logoupload.pl")
local_image_path = "/path/to/your/local/image.jpg" # 替换为实际本地图片路径
imglogo_value = "Update Logo"

begin
  # 检查文件是否存在
  unless File.exist?(local_image_path)
    UI.messagebox("指定的图片文件不存在,请检查路径。")
    exit
  end

  # 构造multipart请求边界
  boundary = "----RubyMultipartBoundary#{Time.now.to_i}"
  post_body = []

  # 添加imglogo字段(对应HTML表单中的提交按钮字段)
  post_body << "--#{boundary}"
  post_body << 'Content-Disposition: form-data; name="imglogo"'
  post_body << ""
  post_body << imglogo_value

  # 添加图片文件字段
  filename = File.basename(local_image_path)
  # 手动识别图片MIME类型,避免依赖第三方库
  mime_type = case File.extname(filename).downcase
              when '.jpg', '.jpeg' then 'image/jpeg'
              when '.png' then 'image/png'
              when '.gif' then 'image/gif'
              else 'application/octet-stream'
              end

  post_body << "--#{boundary}"
  post_body << "Content-Disposition: form-data; name=\"imagefiletoupload\"; filename=\"#{filename}\""
  post_body << "Content-Type: #{mime_type}"
  post_body << ""
  post_body << File.read(local_image_path)

  # 结束请求边界
  post_body << "--#{boundary}--"
  post_body << ""

  # 发送POST请求
  http = Net::HTTP.new(upload_url.host, upload_url.port)
  request = Net::HTTP::Post.new(upload_url)
  request["Content-Type"] = "multipart/form-data; boundary=#{boundary}"
  request.body = post_body.join("\r\n")

  response = http.request(request)
  url_response = response.body

  # 这里添加响应解析逻辑(比如处理JSON返回、判断上传结果等)
  # 示例:url_response = JSON.parse(url_response) if response.content_type.include?('application/json')

rescue StandardError => e
  UI.messagebox("无法连接服务器或上传失败:#{e.message}")
end

第三方库简化方案(推荐)

使用faraday和faraday-multipart插件可以大幅简化代码,适合日常开发:

  1. 先安装依赖gem:
gem install faraday faraday-multipart
  1. 实现代码:
require 'faraday'
require 'faraday/multipart'

# 配置参数
upload_url = "http://design.medeek.com/resources/logoupload.pl"
local_image_path = "/path/to/your/local/image.jpg" # 替换为实际本地图片路径
imglogo_value = "Update Logo"

begin
  # 检查文件是否存在
  unless File.exist?(local_image_path)
    UI.messagebox("指定的图片文件不存在,请检查路径。")
    exit
  end

  # 初始化Faraday客户端,启用multipart支持
  conn = Faraday.new(url: upload_url) do |f|
    f.request :multipart
    f.request :url_encoded
    f.adapter :net_http # 基于标准库Net::HTTP实现
  end

  # 构造请求参数,与HTML表单字段一一对应
  filename = File.basename(local_image_path)
  mime_type = case File.extname(filename).downcase
              when '.jpg', '.jpeg' then 'image/jpeg'
              when '.png' then 'image/png'
              when '.gif' then 'image/gif'
              else 'application/octet-stream'
              end

  payload = {
    imglogo: imglogo_value,
    imagefiletoupload: Faraday::UploadIO.new(local_image_path, mime_type)
  }

  # 发送POST请求
  response = conn.post('', payload)
  url_response = response.body

  # 这里添加响应解析逻辑

rescue StandardError => e
  UI.messagebox("无法连接服务器或上传失败:#{e.message}")
end

注意事项

  • 确保本地图片路径正确,且程序拥有该文件的读取权限
  • 服务器端的logoupload.pl已支持解析multipart/form-data请求(原HTML表单可正常工作则无需调整)
  • 禁止使用GET请求上传文件:GET请求参数长度有限,且不适合传输二进制文件内容

内容的提问来源于stack exchange,提问作者Medeek

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 22:32:21