java - 使用改造 2 分段上传失败

标签 java php android retrofit

我是改造新手,我想使用改造 2 上传。每次上传文件的响应是

Fail Upload

来自 php,但如果我使用 Postman 它总是成功。

下面是我的代码。

主要 Activity

File zip = new File(Environment.getExternalStorageDirectory() + "/test.zip");
            RequestBody reqBody = RequestBody.create(MediaType.parse("multipart/form-file"), zip);
            MultipartBody.Part filePart = MultipartBody.Part.createFormData("file", zip.getName(), reqBody);

            ApiServices api = RetroClient.getApiServices();
            Call<ResponseApiModel> upload = api.fileUpload(filePart);
            upload.enqueue(new Callback<ResponseApiModel>() {
                @Override
                public void onResponse(Call<ResponseApiModel> call, Response<ResponseApiModel> response) {

                    if (response.body().getCode().equals("1")) {
                        Toast.makeText(MainActivity.this, response.body().getMessage(), Toast.LENGTH_SHORT).show();
                    } else {
                        Toast.makeText(MainActivity.this, response.body().getMessage(), Toast.LENGTH_SHORT).show();

                    }
                }

                @Override
                public void onFailure(Call<ResponseApiModel> call, Throwable t) {
                    Log.d("RETRO", "ON FAILURE : " + t.getMessage());
                }
            });

API 服务

@Multipart
@POST("getzip.php")
Call<ResponseApiModel> fileUpload (@Part MultipartBody.Part File);

PHP 代码

$part = "./upload/";
$filename = rand(9,9999).".zip";

$res = array();
$code = "";
$message = "";


if($_SERVER['REQUEST_METHOD'] == "POST")
{
    if(isset($_FILES['file'])){
        $destinationfile = $part.$filename;
        $data = $_FILES['file'];
        if(move_uploaded_file($data['tmp_name'], $destinationfile)) { 
            $code = 1;
            $message = "Success Upload";
        }else {
            $code = 0;
            $message = "Fail Upload";
            }
    }else{
        $code = 0;
        $message = "request error";
    }
}else
{
    $code = 0;
    $message = "Request Not Vaild";
}

$res['code'] = $code;
$res['message'] = $message;

echo json_encode($res);

最佳答案

我不懂 PHP,但我知道 Retrofit。这是我的做法,效果很好,这会上传整个文件夹,您可以相应地更改以处理您的文件。

您需要使用多部分格式。

下面是一个代码示例:

    @Multipart
    @POST("sync/contact/image")
    Call<Response> ImageUpload(@Part MultipartBody.Part file);

    @Multipart
    @POST("sync/image")
    Call<ResponseBody> MultiImageUpload(@PartMap() Map<String, RequestBody> mapFileAndName);


 public static HashMap<String, RequestBody> GetAllImage(Context context) {
        File files = new File(Environment.getExternalStorageDirectory().getAbsolutePath(), "/.ELMEX");
        File[] filesArray = files.listFiles();
        List<File> listOfNames = Arrays.asList(filesArray);
        HashMap<String, RequestBody> map = new HashMap<>(listOfNames.size());
        RequestBody file = null;

        for (int i = 0, size = listOfNames.size(); i < size; i++) {
            file = RequestBody.create(MediaType.parse("multipart/form-data"), listOfNames.get(i));
            map.put("file\"; filename=\"" + listOfNames.get(i).getName() + ".jpg", file);
            file = null;
        }

        return  map;
    }


 HashMap<String, RequestBody> map = UtilImage.GetAllImage(context);

        Call<ResponseBody> call = Retro.getRetroWS().MultiImageUpload(map);
        call.enqueue(new Callback<ResponseBody>() {
            @Override
            public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
                Log.d(TAG, "onResponse: ");
            }

            @Override
            public void onFailure(Call<ResponseBody> call, Throwable t) {
                Log.d(TAG, "onFailure: ");
            }
        });

关于java - 使用改造 2 分段上传失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47090584/

相关文章:

java - 使用 JGit 列出当前分支中的所有标签

javascript - HTML 表 - 跟踪表单提交的选择

php - 获取 exsl :node-set to work in PHP

android aapt 不适用于 arch linux

java - Kafka - 生产者确认

java - 如何模拟注入(inject)模拟的对象的方法

java - 定制 Java 包 JAXB wsimport

php - 什么是 PHPSESSID?

android - 如何在Android中计算两个TIMESTAMP之间的时间差

android - AsyncTask RecyclerView NullPointerException