php - 无法获取从 PHP 中的改造发送的请求正文

标签 php android retrofit

我正在尝试使用改造将多个图像发送到服务器 我正在做的是发送 RequestBody 的 map ,这是我的代码

  @Multipart
@POST("imageuload")
Call<ResponseBody> postImage(@PartMap Map<String, RequestBody> files );

在我的 Activity 中

   Map<String, RequestBody> filestosend = new HashMap<>();
                for (int pos = 0; pos < files.size(); pos++) {
                    RequestBody requestBody = RequestBody.create(MediaType.parse("image/*"), files.get(pos));
                    filestosend.put("photo_" + String.valueOf(pos + 1), requestBody);
                }




                Call<ResponseBody> call = apiSerice.postImage(filestosend);
                call.enqueue(new Callback<ResponseBody>() {
                    @Override
                    public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
                        if (response.isSuccessful()) {
                            try {
                                Toast.makeText(getBaseContext(),response.body().string(),Toast.LENGTH_LONG).show();
                            } catch (IOException e) {
                                e.printStackTrace();
                            }
                        }else {
                            try {
                                AlertDialog.Builder alert = new AlertDialog.Builder(MainActivity.this);

                                alert.setMessage(response.errorBody().string());
                                alert.show();
                            } catch (IOException e) {
                                e.printStackTrace();
                            }
                        }
                    }

                    @Override
                    public void onFailure(Call<ResponseBody> call, Throwable t) {
                        t.printStackTrace();


                    }
                });

当我想测试我得到的内容时,它从服务器返回一个空响应,而我的响应中什么也没有得到..

echo file_get_contents('php://input');

我什至用单个请求主体进行了测试

  RequestBody test = RequestBody.create(MediaType.parse("text/plain"), "test");

                Call<ResponseBody> call = apiSerice.postImage(test);

但我的回复中仍然收到空回复 我将不胜感激任何帮助或评论

最佳答案

可以通过 PHP 访问分段上传 $_FILESPHP manual关于 php://input 有以下说法:

php://input is not available with enctype="multipart/form-data".

完整的工作示例(减去正确的端点 URL、硬编码字节数组):

public class Sample {

    interface SampleService {
        @Multipart
        @POST("/test.php")
        Call<ResponseBody> postImage(@Part List<MultipartBody.Part> files);
    }

    public static void main(String[] args) throws IOException {
        Retrofit retrofit = new Retrofit.Builder().baseUrl("http://...").build();
        SampleService service = retrofit.create(SampleService.class);

        RequestBody file1 = RequestBody.create(MediaType.parse("image/jpeg"), new byte[]{0x00});
        MultipartBody.Part part1 = MultipartBody.Part.createFormData("A kitten", "Kitten.jpg", file1);

        RequestBody file2 = RequestBody.create(MediaType.parse("image/jpeg"), new byte[]{0x00});
        MultipartBody.Part part2 = MultipartBody.Part.createFormData("Another kitten", "Kitten2.jpg", file2);

        System.out.println(service.postImage(Arrays.asList(part1, part2)).execute().body().string());
    }
}

服务器代码:

<?php var_dump($_FILES); ?>

客户端输出:

array(2) {
  ["A_kitten"]=>
  array(5) {
    ["name"]=>
    string(10) "Kitten.jpg"
    ["type"]=>
    string(10) "image/jpeg"
    ["tmp_name"]=>
    string(14) "/tmp/phpml5PIP"
    ["error"]=>
    int(0)
    ["size"]=>
    int(1)
  }
  ["Another_kitten"]=>
  array(5) {
    ["name"]=>
    string(11) "Kitten2.jpg"
    ["type"]=>
    string(10) "image/jpeg"
    ["tmp_name"]=>
    string(14) "/tmp/phpzhgXm0"
    ["error"]=>
    int(0)
    ["size"]=>
    int(1)
  }
}

关于php - 无法获取从 PHP 中的改造发送的请求正文,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42491472/

相关文章:

php - Yii2 - 货币符号位置

java - 我如何收听 Android 的联系人启动 Activity ?

Retrofit 响应中的 Android 空指针异常

PHP 与 MYSQL DB 基于角色的登录重定向

php - 错误: Database table jobs for model Job was not found

android - ConstraintLayout 的任何布局管理器?

javascript - Android 浏览器和 iOS Chrome 是否支持全屏 API?

java - Retrofit/Gson 将空模型放入 List<>

android - 通过 Retrofit 从内存上传位图

php - 将 php 变量从 Controller 传递到 View 头部的 javascript 函数