Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 向Rails发送压缩文件的UTF-8中的字节序列无效_Ruby On Rails - Fatal编程技术网

Ruby on rails 向Rails发送压缩文件的UTF-8中的字节序列无效

Ruby on rails 向Rails发送压缩文件的UTF-8中的字节序列无效,ruby-on-rails,Ruby On Rails,我有一个运行在Ruby 2.0.0上的Rails API应用程序,它接受XML文件。当我使用curl--data binary发送未压缩的文件时,它工作得很好,但当我发送压缩的文件时,它会通过Rack utils崩溃 CURL命令 curl-u user:password--compressed-H“Content Encoding:gzip”--data binary“@reading.xml.gz”http://localhost:3002/readings 错误堆栈跟踪 Argumen

我有一个运行在Ruby 2.0.0上的Rails API应用程序,它接受XML文件。当我使用curl
--data binary
发送未压缩的文件时,它工作得很好,但当我发送压缩的文件时,它会通过Rack utils崩溃

CURL命令

curl-u user:password--compressed-H“Content Encoding:gzip”--data binary“@reading.xml.gz”http://localhost:3002/readings

错误堆栈跟踪

  ArgumentError (invalid byte sequence in UTF-8):
rack (1.5.2) lib/rack/utils.rb:104:in `normalize_params'
rack (1.5.2) lib/rack/utils.rb:96:in `block in parse_nested_query'
rack (1.5.2) lib/rack/utils.rb:93:in `each'
rack (1.5.2) lib/rack/utils.rb:93:in `parse_nested_query'
rack (1.5.2) lib/rack/request.rb:373:in `parse_query'
actionpack (4.0.1) lib/action_dispatch/http/request.rb:321:in `parse_query'
rack (1.5.2) lib/rack/request.rb:211:in `POST'
actionpack (4.0.1) lib/action_dispatch/http/request.rb:282:in `POST'
actionpack (4.0.1) lib/action_dispatch/http/parameters.rb:16:in `parameters'
actionpack (4.0.1) lib/action_dispatch/http/filter_parameters.rb:37:in `filtered_parameters'
actionpack (4.0.1) lib/action_controller/metal/instrumentation.rb:22:in `process_action'
actionpack (4.0.1) lib/abstract_controller/base.rb:136:in `process'
actionpack (4.0.1) lib/abstract_controller/rendering.rb:44:in `process'
actionpack (4.0.1) lib/action_controller/metal.rb:195:in `dispatch'
actionpack (4.0.1) lib/action_controller/metal/rack_delegation.rb:13:in `dispatch'
actionpack (4.0.1) lib/action_controller/metal.rb:231:in `block in action'
actionpack (4.0.1) lib/action_dispatch/routing/route_set.rb:80:in `call'
actionpack (4.0.1) lib/action_dispatch/routing/route_set.rb:80:in `dispatch'
actionpack (4.0.1) lib/action_dispatch/routing/route_set.rb:48:in `call'
actionpack (4.0.1) lib/action_dispatch/journey/router.rb:71:in `block in call'
actionpack (4.0.1) lib/action_dispatch/journey/router.rb:59:in `each'
actionpack (4.0.1) lib/action_dispatch/journey/router.rb:59:in `call'
actionpack (4.0.1) lib/action_dispatch/routing/route_set.rb:680:in `call'

...
我在rack utils的相关行上放置了一个调试器,如果我将force_encode转换为二进制,我就可以通过了,但是为什么编码会发生变化呢

更新1:添加了CURL输出

== Info: Adding handle: conn: 0x7fb78c010800
== Info: Adding handle: send: 0
== Info: Adding handle: recv: 0
== Info: Curl_addHandleToPipeline: length: 1
== Info: - Conn 0 (0x7fb78c010800) send_pipe: 1, recv_pipe: 0
== Info: About to connect() to localhost port 3002 (#0)
== Info:   Trying 127.0.0.1...
== Info: Connected to localhost (127.0.0.1) port 3002 (#0)
== Info: Server auth using Basic with user '1'
=> Send header, 254 bytes (0xfe)
0000: POST /readings HTTP/1.1
001c: Authorization: Basic
005c: ycg==
0063: User-Agent: curl/7.30.0
007c: Host: localhost:3002
0092: Accept: */*
009f: Content-Length: 1154
00b5: Content-Type: application/x-www-form-urlencoded
00e6: Expect: 100-continue
00fc: 
== Info: Done waiting for 100-continue
=> Send data, 1154 bytes (0x482)
0000: ....)v.L..reading.xml...Qo.8...O...{/$N.6..R..Zi[...>.V....]
0040: H..P.........{...Fu<.....v.*.L.`....._</..l...Y..L.....z?..w....
0080: ./L|..*.....o...i.I...<..o.Y...o...}..r...?..xR-EU.I...o.&_..L|.
00c0: 5..-..I..x......"...:]~..M........0... .0..0.z....T.....W+N.(.z.
0100: 0.TAd....l&.d....h...x.G....m....U3.W..BO.n...MUgE.... ..:.KeH{.
0140: R.v.........GR=2Z.7r....k*.5H.v....`..wd'.Ug.......~:..L..r...Fi
0180: l.D.V.'......M..9...T~'`...t)...k>V...s..._._.c#."_..:.W5.....3.
01c0: .}..T2-j.f>E^r'....:J'..^..7$5"7..`.F.......TG..[.MF@s9.GH.B.M,.
0200: j..y.<.hH.8..Ve.N/y.e4....b..ac.P1.j..h....y<I.../_...w.L=..m...
0240: ....D=.....G....k7...(..M.s{.=....4}...eO...2.?...F]Da....:.$.q
0280: ..{...0.F.8.Hu.[.?..Z...V....`Z.E....<.M|7l...<..Y....E.By.....m
02c0: ..*....y.U3.YZs&o-uJ....yc..M.....I...gksq....Rm&...I.....s.^D~.
0300: W....h/r..........R.h..va......B.;./{H|....w.i.r..szZU.m..$....s
0340: .....].*.......Jzlx<..OnlT:t..3....".Gj{...ve...<...*.Bq..Q.E...
0380: ...Z....@..A.).?).N;.K..p...,......Q.9@.@s.1.1..`.0.....-..]....
03c0: ....Q..q...s.....B.......2....A2H.. .$.d...A2H.. .$.d...A2H.. .
0400: $.d...A2H.. .$.d...A2H.. .$.d...A2H.. .$.d...A2H.. .$..&....6O?.
0440: ....D...x.qt..........................cS.K...>..?........?....\
0480: ..
<= Recv header, 36 bytes (0x24)
0000: HTTP/1.1 500 Internal Server Error
<= Recv header, 40 bytes (0x28)
0000: Content-Type: text/html; charset=utf-8
<= Recv header, 52 bytes (0x34)
0000: X-Request-Id: 23dce9ed-4245-41b2-8c06-024a7b3bf37a
<= Recv header, 21 bytes (0x15)
0000: X-Runtime: 0.026871
<= Recv header, 23 bytes (0x17)
0000: Content-Length: 13032
== Info: HTTP error before end of send, stop sending
<= Recv header, 2 bytes (0x2)
0000: 
<= Recv data, 13032 bytes (0x32e8)
0000: The standard rails stack trace HTML page went here.

== Info: Closing connection 0
==信息:添加句柄:连接:0x7fb78c010800
==信息:添加句柄:发送:0
==信息:添加句柄:recv:0
==Info:Curl\u addHandleToPipeline:length:1
==信息:-Conn 0(0x7fb78c010800)发送管道:1,接收管道:0
==信息:即将()连接到本地主机端口3002(#0)
==信息:正在尝试127.0.0.1。。。
==信息:已连接到本地主机(127.0.0.1)端口3002(#0)
==信息:对用户“1”使用Basic进行服务器身份验证
=>发送头,254字节(0xfe)
0000:POST/readings HTTP/1.1
001c:授权:基本
005c:ycg==
0063:用户代理:curl/7.30.0
007c:主机:本地主机:3002
0092:接受:*/*
009f:内容长度:1154
00b5:内容类型:应用程序/x-www-form-urlencoded
00e6:期望值:100继续
00fc:
==信息:已完成等待100次继续
=>发送数据,1154字节(0x482)
0000:…)v.L..reading.xml…Qo.8…O..{/$N.6..R..Zi[…>.v..]

0040:H..P....{…Fu

如果您试图模拟表单上载,并希望上载的数据在

参数中可用,则需要适当调用cURL:

curl --trace-ascii - -u user:password --compressed --form "reading=@reading.xml.gz" http://localhost:3002/readings 
这将通过调用
params[:reading].read使上载的文件内容可用

您正在调用的命令发送一个原始Gzip文件作为POST内容,该文件无法使用指定的内容类型(
application/x-www-form-urlencoded
)进行解析。如果您希望手动接收此上载(可能通过调用
request.body.read
),适当地设置
内容类型
,这样Rails就不会试图将主体解析为表单上载:

curl --trace-ascii - -u user:password --compressed -H "Content-Type: application/xml" -H "Content-Encoding: gzip" --data-binary "@test-deployment.txt.gz" http://localhost:3002/readings 

还有更多的讨论可能会为您指明正确的方向。

如果您试图模拟表单上载,并希望上载的数据在
参数中可用,则需要适当地调用cURL:

curl --trace-ascii - -u user:password --compressed --form "reading=@reading.xml.gz" http://localhost:3002/readings 
这将通过调用
params[:reading].read使上载的文件内容可用

您正在调用的命令发送一个原始Gzip文件作为POST内容,该文件无法使用指定的内容类型(
application/x-www-form-urlencoded
)进行解析。如果您希望手动接收此上载(可能通过调用
request.body.read
),适当地设置
内容类型
,这样Rails就不会试图将主体解析为表单上载:

curl --trace-ascii - -u user:password --compressed -H "Content-Type: application/xml" -H "Content-Encoding: gzip" --data-binary "@test-deployment.txt.gz" http://localhost:3002/readings 

还有更多的讨论可能会为您指明正确的方向。

如果您试图模拟表单上载,并希望上载的数据在
参数中可用,则需要适当地调用cURL:

curl --trace-ascii - -u user:password --compressed --form "reading=@reading.xml.gz" http://localhost:3002/readings 
这将通过调用
params[:reading].read使上载的文件内容可用

您正在调用的命令发送一个原始Gzip文件作为POST内容,该文件无法使用指定的内容类型(
application/x-www-form-urlencoded
)进行解析。如果您希望手动接收此上载(可能通过调用
request.body.read
),适当地设置
内容类型
,这样Rails就不会试图将主体解析为表单上载:

curl --trace-ascii - -u user:password --compressed -H "Content-Type: application/xml" -H "Content-Encoding: gzip" --data-binary "@test-deployment.txt.gz" http://localhost:3002/readings 

还有更多的讨论可能会为您指明正确的方向。

如果您试图模拟表单上载,并希望上载的数据在
参数中可用,则需要适当地调用cURL:

curl --trace-ascii - -u user:password --compressed --form "reading=@reading.xml.gz" http://localhost:3002/readings 
这将通过调用
params[:reading].read使上载的文件内容可用

您正在调用的命令发送一个原始Gzip文件作为POST内容,该文件无法使用指定的内容类型(
application/x-www-form-urlencoded
)进行解析。如果您希望手动接收此上载(可能通过调用
request.body.read
),适当地设置
内容类型
,这样Rails就不会试图将主体解析为表单上载:

curl --trace-ascii - -u user:password --compressed -H "Content-Type: application/xml" -H "Content-Encoding: gzip" --data-binary "@test-deployment.txt.gz" http://localhost:3002/readings 

还有更多的讨论可能会为您指明正确的方向。

您是否将请求内容类型设置为压缩类型?请编辑您的问题,将
curl
调用的输出包括在内,并附加
--trace ascii-
(注意STDOUT后面的破折号。)我用ascii跟踪更新了问题。@MaurícioLinhares您的意思是设置HTTP头吗?“内容编码:gzip”没有任何效果。您是否将请求内容类型设置为压缩类型?请编辑您的问题,将
curl
调用的输出包括在
--trace ascii-
之后(注意后面的破折号表示STDOUT。)我用ascii跟踪更新了这个问题。@MaurícioLinhares您的意思是设置HTTP头?-H“内容编码:gzip”没有任何效果。您是否将请求内容类型设置为压缩类型?请编辑您的问题,将
curl
调用的输出包括在内,并附加
--trace ascii-
(注意STDOUT后面的破折号)我用ascii跟踪更新了问题。@MaurícioLinhares您的意思是设置HTTP头吗?“内容编码:gzip”没有任何效果。您是否将请求内容类型设置为压缩类型?请编辑您的问题,将
curl
调用的输出包括在
--trace ascii-
之后(注意标准输出后面的破折号。)我用ascii跟踪更新了问题。@M