简体   繁体   中英

Failed multipart upload using retrofit 2

I'm new at retrofit and I want to upload using retrofit 2. Every uploading the file the response is

Fail Upload

from the php but if I'm using Postman it always success.

Below is my code.

Main 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 Services

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

PHP Code

$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);

I don't know PHP but I know Retrofit. Here is how I do it and works perfectly, this uploads the whole folder, you may change accordingly to handle your files.

You need to use Multipart Format.

Here is a code sample below:

    @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: ");
            }
        });

You can check all the suggestions given in this answer . Check out all the answers and comments, not just the accepted answer, because there are some really good ideas on what could be wrong, as well as good ideas on how to debug the problem.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM