目录
PHP后台接受不到文件数组
有开发者反馈后台是PHP,用html写的表单传文件数组,PHP可以接受到这个数组,但是用NoHttp的时候PHP后台只能接受到数组的最后一个文件。
我是做Java开发的,于是写了个Java后台测试,结果显示NoHttp完全没有问题,于是我去翻了PHP的文档,发现这个PHP的特性,在说明之前先看看NoHttp是怎么一个key
传文件数组的。
传送门:php传文件数组的官方文档说明连接。
第一种做法,添加List<Binary>
:
List<Binary> binaries = new Arraylist<>(); // 文件list。
binaries.add(new FileBinary(file));
binaries.add(new BitmapBinary(bitmap, "head.png"));
Request<String> request = new StringRequest(url, RequestMethod.POST)
.add("images", binaries); // 添加文件list。
第二种做法,添加多个相同Key的Binary:
File file = ...
Bitmap bitmap = ...
Request<String> request = new StringRequest(url, RequestMethod.POST);
// 添加多个相同key的Binary。
.add("images", new FileBinary(file))
.add("images", new BitmapBinary(bitmap, "nohttp.png"));
PHP用html传文件list的方式
解释这个问题之前要先看看PHP在html
中是如何传文件数组的,html
的form
是这样写的:
<form action="file-upload.php" method="post" enctype="multipart/form-data">
<input name="userfile[]" type="file" /><br />
<input name="userfile[]" type="file" /><br />
<input type="submit" value="上传" />
</form>
我们看到这里有两个file input
,name
为userfile[]
,也就是NoHttp中的Request#add(String key, Binary value)
中的key。
在PHP中这样接受:$_FILES["userfile"]
,所以这里我们发现后台获取这个FileList的时候的key
是userfile
,所以后台告诉Android开发者你传文件数组的时候的key是userfile
,这是因为PHP要求一个key
传文件数组的时候,key
必须是key[]
,它才会视为文件数组,到PHP后台的时候会自动把这个[]
去掉,否则它将会被相同的key覆盖,这就是为什么使用NoHttp传文件list的时候PHP只能接受最后一个文件的原因。
解决方案
根据上面的分析我想你肯定明白了,就是在我们之前的key
后面加[]
:
List<Binary> binaries = new Arraylist<>(); // 文件list。
binaries.add(new FileBinary(file));
binaries.add(new BitmapBinary(bitmap, "head.png"));
Request<String> request = new StringRequest(url, RequestMethod.POST)
.add("images[]", binaries); // 添加文件list。