企业🤖AI Agent构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
# 目录 [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。 ```