目录

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中是如何传文件数组的,htmlform是这样写的:

<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 inputnameuserfile[],也就是NoHttp中的Request#add(String key, Binary value)中的key。

在PHP中这样接受:$_FILES['userfile'],所以这里我们发现后台获取这个FileList的时候的keyuserfile,所以后台告诉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。