如何在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插件可以大幅简化代码,适合日常开发:
- 先安装依赖gem:
gem install faraday faraday-multipart
- 实现代码:
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
相关产品推荐
相关产品推荐

