# 目錄
[TOC]
# PHP后臺接受不到文件數組
有開發者反饋后臺是PHP,用html寫的表單傳文件數組,PHP可以接受到這個數組,但是用NoHttp的時候PHP后臺只能接受到數組的最后一個文件。
我是做Java開發的,于是寫了個Java后臺測試,結果顯示NoHttp完全沒有問題,于是我去翻了PHP的文檔,發現這個PHP的特性,在說明之前先看看NoHttp是怎么一個`key`傳文件數組的。
傳送門:[php傳文件數組的官方文檔說明連接](http://php.net/manual/en/features.file-upload.multiple.php)。
第一種做法,添加`List<Binary>`:
```java
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:
```java
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`是這樣寫的:
```html
<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`后面加`[]`:
```java
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。
```