这是Rack中的错误吗?

我正在尝试使用java客户端将多部分内容(文件和一些字符串)发布到localhost上的Sinatra服务器。 似乎服务器不喜欢POST消息。 堆栈跟踪是:

ERROR NoMethodError: undefined method `rewind' for "hi":String D:/Ruby192/lib/ruby/gems/1.9.1/gems/rack-1.2.3/lib/rack/utils.rb:581:in`block in parse_multipart' D:/Ruby192/lib/ruby/gems/1.9.1/gems/rack-1.2.3/lib/rack/utils.rb:499:in`loop' D:/Ruby192/lib/ruby/gems/1.9.1/gems/rack-1.2.3/lib/rack/utils.rb:499:in`parse_multipart' D:/Ruby192/lib/ruby/gems/1.9.1/gems/rack-1.2.3/lib/rack/request.rb:270:in `parse_multipart' D:/Ruby192/lib/ruby/gems/1.9.1/gems/rack-1.2.3/lib/rack/request.rb:148:in `POST' D:/Ruby192/lib/ruby/gems/1.9.1/gems/rack-1.2.3/lib/rack/methodoverride.rb:15:in `call' D:/Ruby192/lib/ruby/gems/1.9.1/gems/sinatra-1.2.6/lib/sinatra/base.rb:1272:in `block in call' D:/Ruby192/lib/ruby/gems/1.9.1/gems/sinatra-1.2.6/lib/sinatra/base.rb:1303:in `synchronize' D:/Ruby192/lib/ruby/gems/1.9.1/gems/sinatra-1.2.6/lib/sinatra/base.rb:1272:in `call' D:/Ruby192/lib/ruby/gems/1.9.1/gems/rack-1.2.3/lib/rack/content_length.rb:13:in `call' D:/Ruby192/lib/ruby/gems/1.9.1/gems/rack-1.2.3/lib/rack/handler/webrick.rb:52:in `service' D:/Ruby192/lib/ruby/1.9.1/webrick/httpserver.rb:111:in `service' D:/Ruby192/lib/ruby/1.9.1/webrick/httpserver.rb:70:in `run' D:/Ruby192/lib/ruby/1.9.1/webrick/server.rb:183:in `block in start_thread' 

我的服务器在post消息中打印出params。 以下是我的java客户端的内容:

 Content-Disposition: form-data; name="file"; filename="fff.jpg" Content-Type: image/jpeg Content-Transfer-Encoding: binary # Content-Disposition: form-data; name="jjj" Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit hi 

我正在使用的java代码是:

 HttpClient httpclient = new DefaultHttpClient(); HttpPost httppost = new HttpPost("http://localhost:4567/upload"); File file = new File("D:/My Documents/My Desktop/fff.jpg"); MultipartEntity mpEntity = new MultipartEntity(); ContentBody cbFile = new FileBody(file, "image/jpeg"); mpEntity.addPart("file", cbFile); ContentBody stringBody = new StringBody("hi", Charset.forName("UTF8")); mpEntity.addPart("jjj", stringBody); httppost.setEntity(mpEntity); HttpResponse response = httpclient.execute(httppost); 

因此,当内容类型是字符串时,Rack似乎不喜欢处理内容类型。 当param不是文件时,我将rack / utils.rb中的content_type变量设置为nil ,一切正常。 这是故意还是应该作为错误提交?
另请参见http://blogs.oracle.com/mandy/entry/rack_and_content_type_for 。

这是一个Rack bug,但你可以通过像这样的上传来避免它:

 HttpPost httpost = new HttpPost( "http://192.168.140.17:3000/ze/api/documents.xml"); MultipartEntity entity = new MultipartEntity( HttpMultipartMode.BROWSER_COMPATIBLE ); entity.addPart( "folder_id", new StringBody("3", "multipart/form-data", Charset.defaultCharset()) );//f2 entity.addPart( "labels", new StringBody("1,3,4", "form-data", Charset.defaultCharset() ) ); entity.addPart( "uploaded_data", new FileBody(this.file, filename, "application/pdf", null) ); httpost.setEntity(entity); 

问题是使用HttpMultipartMode.BROWSER_COMPATIBLE创建MultipartEntity。