在Ruby中,如何使用RESTClient在单个请求中上载多个文件

时间:2013-06-04 19:22:53

标签: ruby

我必须上传多个文件作为表单请求。我正在使用Rest Client发布我的请求。我能够上传单个文件,但我不知道如何在单个请求中添加多个文件。

我搜索/搜索了这样的选项,我找不到解决问题的任何解决方案。

以下是我的代码。

它有可变参数(* yamlfile),它接受一个或多个文件。我必须将所有文件一起上传。

现在的问题是,当我添加循环以在有效负载内提取文件时,我收到语法错误。 我现在的假设是在有效载荷之外形成这个并将其包含在有效载荷块内,但我不知道该怎么做。 有人可以帮助我。 (我也尝试过net / http / post / multipart库,我找不到很多文档)

def uploadRest(endpoint,archive_file_path,,yaml_file_path,*yamlfile)

  $arg_len=yamlfile.length

  request = RestClient::Request.new(
          :method => :post,
          :url => endpoint,
          :payload => {
            :multipart => true,
            :job_upload_archive => File.new(archive_file_path,'rb'),
            :job_upload_path => "/tmp",

           # Trying to add multiple file, but I get syntax error  
           yamlfile.each_with_index { |yaml, index|
              :job_upload_yaml_file+index => File.new("#{yaml_file_path}/#{pmml}")

              }

          })
  response=request.execute
  puts response.code

end  

4 个答案:

答案 0 :(得分:1)

uploadRest(endpoint,archive_file_path,yaml_file_path,*yamlfile) 
@files=Array.new
yamlfile.each{ |yaml_file| 
          @files.push(File.new("#{yaml_file_path}/#{yaml_file}")) 
}
request = RestClient::Request.new(
      :method => :post, 
      :url => endpoint, 
      :payload => { :multipart => true, :job_upload_archive => File.new(archive_file_path,'rb'), 
:job_upload_path => "/tmp", :job_upload_yaml_file => @files }) 

    response=request.execute 
end

答案 1 :(得分:1)

我遇到了类似的问题,并且能够通过将数组数组作为请求传递来实现此功能。

FirstExample.java:1: error: class, interface, or enum expected
Class FirstExample
^
FirstExample.java:3: error: class, interface, or enum expected
                public static void main(String[] args)
                              ^
FirstExample.java:6: error: class, interface, or enum expected
               }
               ^
3 errors

答案 2 :(得分:0)

您的问题代码存在两个问题:

1)尝试将符号添加到整数

2)尝试将yamlfile的内容直接插入到哈希中(因为这是yamlfile.each_with_index 返回的内容,而不是它调用块的方式。块的返回值是没用过)

这两个代码问题都被读作好像您已经获得了HAML或其他模板语言的经验,并且使用的结构/想法会起作用吗?

Ruby中有许多可能的解决方案,但是一种简单的方法可以在部分中构建哈希,而不是一次性生成哈希,并且嵌入了巧妙的哈希返回例程。尝试这样的事情:

payload_hash = {
  :multipart => true,
  :job_upload_archive => File.new(archive_file_path,'rb'),
  :job_upload_path => "/tmp",
}

# This does not use the return value from each_with_index, instead it relies
# on the block to make changes to the hash by adding new key/value pairs
yamlfile.each_with_index { |yaml, index|
  # This concatenates two strings, and then converts the combined
  # string into the symbol that you want
  file_key = ("job_upload_yaml_file"+index.to_s).to_sym
  payload_hash[file_key] = File.new("#{yaml_file_path}/#{yaml}")
}

request = RestClient::Request.new(
      :method => :post,
      :url => endpoint,
      :payload => payload_hash
)

为了增加代码清洁度,您可以将前两个部分设置为单独的方法,并将其调用到当前具有payload_hash的位置。

这可以让你了解当前的语法障碍。但是,我没有尝试检查是否允许您通过RESTClient上传多个文件。

答案 3 :(得分:-1)

第1节:

@params = {         " FacialImage" => UploadIO.new(File.new(' C:\ temp \ ATDD \ Test \ test \ sachin.jpg')," image / jpeg"),         "登录" => UploadIO.new(File.new(' C:\ temp \ ATDD \ Test \ test \ login.txt')," application / json")    }