【发布时间】:2015-02-03 01:42:06
【问题描述】:
试图上传照片,但无法将文件数据发送到服务器。应用程序启动摄像头并向服务器发送 POST,但从未上传任何文件。
我已经创建了最简单的应用程序,可以在https://github.com/dustinb/Camera/blob/master/index.html 进行测试。当上传发生时,只有 452 字节发送到服务器。
73.3.252.133 - - [04/Dec/2014:23:55:11 +0000] "POST /upload HTTP/1.1" 200 452 "-" "Dalvik/1.4.0 (Linux; U; Android 2.3.4; ADR6400L Build/GRJ22)"
我看过很多这样的例子,但看不出有什么不同。我正在使用 build.phonegap.com 构建和安装
编辑:使用 tcpdump 我可以看到数据正在到达服务器,只是 PHP 中的 $_POST 或 $_FILES 变量中没有任何内容
0x0030: 150c 34c5 504f 5354 202f 7570 6c6f 6164 ..4.POST./upload
0x0040: 2048 5454 502f 312e 310d 0a43 6f6e 7465 .HTTP/1.1..Conte
0x0050: 6e74 2d54 7970 653a 206d 756c 7469 7061 nt-Type:.multipa
0x0060: 7274 2f66 6f72 6d2d 6461 7461 3b20 626f rt/form-data;.bo
0x0070: 756e 6461 7279 3d2b 2b2b 2b2b 0d0a 5573 undary=+++++..Us
0x0080: 6572 2d41 6765 6e74 3a20 4461 6c76 696b er-Agent:.Dalvik
0x0090: 2f31 2e34 2e30 2028 4c69 6e75 783b 2055 /1.4.0.(Linux;.U
0x00a0: 3b20 416e 6472 6f69 6420 322e 332e 343b ;.Android.2.3.4;
0x00b0: 2041 4452 3634 3030 4c20 4275 696c 642f .ADR6400L.Build/
0x00c0: 4752 4a32 3229 0d0a 486f 7374 3a20 7371 GRJ22)..Host:.sq
0x00d0: 7561 7265 732e 726f 756e 6470 6f72 6368 uares.roundporch
0x00e0: 2e63 6f6d 0d0a 436f 6e6e 6563 7469 6f6e .com..Connection
0x00f0: 3a20 4b65 6570 2d41 6c69 7665 0d0a 4163 :.Keep-Alive..Ac
0x0100: 6365 7074 2d45 6e63 6f64 696e 673a 2067 cept-Encoding:.g
0x0110: 7a69 700d 0a43 6f6e 7465 6e74 2d4c 656e zip..Content-Len
0x0120: 6774 683a 2032 3933 3530 0d0a 0d0a gth:.29350....
-- next packet --
0x0000: 4500 05dc 617d 4000 3206 a8e9 4903 fc85 E...a}@.2...I...
0x0010: 68cf 8a5d d68c 0050 aa2b ce30 13d2 95d7 h..]...P.+.0....
0x0020: 8010 02da 80ec 0000 0101 080a 01be ac57 ...............W
0x0030: 150c 34c5 ffd8 ffe1 0116 4578 6966 0000 ..4.......Exif..
0x0040: 4949 2a00 0800 0000 0e00 3201 0200 1400 II*.......2.....
似乎问题在于 Content-Disposition 的 mime 边界和其他标头未发送。可以在发送 Content-Length 后的转储中看到 JPEG 数据立即发送,不使用 mime 边界。
【问题讨论】:
-
您的服务器是否已启动并能够从应用程序接收数据而没有任何问题,例如防火墙、代理等。另外,如果您使用任何 Web 服务上传图像,您可以单独测试一下吗
-
您的代码非常正确,我使用了类似的并且有效:参见我的示例stackoverflow.com/questions/27155646/…
-
你不能在没有应用程序的情况下上传图片 - 我的意思是如果你创建一个测试 webapp 来上传图片并查看差异。通过这种方式,至少您可以确定服务器/网络服务工作正常,现在问题出在移动应用程序(代码)上......这只是一个分离问题的想法
-
查看 tcpdump 我看到正在上传的数据(更新的问题),但没有 $_POST 或 $_FILES 数据。相同的 /upload 脚本适用于标准 Web 浏览器上传。与服务器端或电话差距如何编码 POST 数据不合作。
-
我注意到的一件事是多部分边界显示为 +++++.. 但从未使用过边界,FileTransfer 只是在请求正文中发送原始 jpeg 数据,没有边界信息。当我使用标准网络上传表单进行相同的转储时,请求具有名称的 mime 边界,文件名标题然后发送图像数据