簡體   English   中英

使用改造2的分段上傳失敗

[英]Failed multipart upload using retrofit 2

我是改造的新手,我想使用改造2進行上傳。每次上傳文件時,響應都是

上傳失敗

從PHP,但如果我使用郵遞員,它總是成功。

下面是我的代碼。

主要活動

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,但我知道翻新。 這是我的操作方式,可以正常工作,這將上傳整個文件夾,您可以進行相應更改以處理文件。

您需要使用多部分格式。

這是下面的代碼示例:

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

您可以檢查此答案中給出的所有建議。 檢查所有答案和評論,而不僅僅是接受的答案,因為對於可能出問題的地方有一些非常好的主意,以及關於如何調試問題的好主意。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM