PHP后台传文件list接受不到
最后更新于:2022-04-01 23:20:28
# 目录
[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`:
```java
List binaries = new Arraylist<>(); // 文件list。
binaries.add(new FileBinary(file));
binaries.add(new BitmapBinary(bitmap, "head.png"));
Request request = new StringRequest(url, RequestMethod.POST)
.add("images", binaries); // 添加文件list。
```
第二种做法,添加多个相同Key的Binary:
```java
File file = ...
Bitmap bitmap = ...
Request 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
```
我们看到这里有两个`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 binaries = new Arraylist<>(); // 文件list。
binaries.add(new FileBinary(file));
binaries.add(new BitmapBinary(bitmap, "head.png"));
Request request = new StringRequest(url, RequestMethod.POST)
.add("images[]", binaries); // 添加文件list。
```
';