【问题标题】:Uploading multiple image files using okhttp v3.2.0使用 okhttp v3.2.0 上传多个图片文件
【发布时间】:2016-06-29 12:55:11
【问题描述】:

我正在尝试使用 okhttp v3.2.0 上传具有多个图像(可以是无或最多 4 个)的多部分数据,主要问题是,除了图像之外的所有数据都上传到服务器。我尝试了 okhttp 在其配方页面上的源代码,我还尝试了 Uploading a large file in multipart using OkHttpFile upload with okhttp 但没有发现任何成功。该应用程序没有崩溃,没有错误。但是图片没有上传。我还使用 POSTMAN 检查了服务器端 API,它工作正常,没有任何问题。这是我的代码,不胜感激。

String URL = BASE_URL + "PostRequest.php";
MediaType MEDIA_TYPE;

Calendar c = Calendar.getInstance();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String PostDate = sdf.format(c.getTime());

mOkHttpClient = new OkHttpClient.Builder()
                .connectTimeout(20, TimeUnit.SECONDS)
                .writeTimeout(60, TimeUnit.SECONDS)
                .readTimeout(40, TimeUnit.SECONDS)
                .build();

MultipartBody.Builder mRequestBody = new MultipartBody.Builder()
    .setType(MultipartBody.FORM);
    mRequestBody.addFormDataPart("SECURITYCODE",SECURITY_CODE);
    mRequestBody.addFormDataPart("EMAIL", Email);
    mRequestBody.addFormDataPart("CATEGORY", Category);
    mRequestBody.addFormDataPart("SUBCATEGORY", SubCategory);
    mRequestBody.addFormDataPart("TITLE", Title);
    mRequestBody.addFormDataPart("DESCRIPTION", Description);
    mRequestBody.addFormDataPart("LOCATION", Location);
    mRequestBody.addFormDataPart("POSTDATE", PostDate);
    mRequestBody.addFormDataPart("LOCALITY", Locality);
    mRequestBody.addFormDataPart("TOTALIMAGES", Imagepaths.size()+"");

if (Imagepaths.size() > 0) {
    File file = new File(Imagepaths.get(0));
    if (file.exists()) {
        Log.d("file exist", "yes");
    }
    MEDIA_TYPE = Imagepaths.get(0).endsWith("png") ?    
        MediaType.parse("image/png") : MediaType.parse("image/jpeg");
    RequestBody imageBody = RequestBody.create(MEDIA_TYPE, file);
    mRequestBody.addFormDataPart("IMAGE1", "IMAGE1", imageBody);
}

if (Imagepaths.size() > 1) {
    File file = new File(Imagepaths.get(1));
    MEDIA_TYPE = Imagepaths.get(0).endsWith("png") ? 
        MediaType.parse("image/png") : MediaType.parse("image/jpeg");
    RequestBody imageBody = RequestBody.create(MEDIA_TYPE, file);
    mRequestBody.addFormDataPart("IMAGE2", "IMAGE2", imageBody);
}

if (Imagepaths.size() > 2) {
    File file = new File(Imagepaths.get(2));
    MEDIA_TYPE = Imagepaths.get(0).endsWith("png") ? 
        MediaType.parse("image/png") : MediaType.parse("image/jpeg");
    RequestBody imageBody = RequestBody.create(MEDIA_TYPE, file);
    mRequestBody.addFormDataPart("IMAGE3", "IMAGE3", imageBody);
}

if (Imagepaths.size() > 3) {
    File file = new File(Imagepaths.get(3));
    MEDIA_TYPE = Imagepaths.get(0).endsWith("png") ? 
        MediaType.parse("image/png") : MediaType.parse("image/jpeg");
    RequestBody imageBody = RequestBody.create(MEDIA_TYPE, file);
    mRequestBody.addFormDataPart("IMAGE4", "IMAGE4", imageBody);
}

RequestBody rb = mRequestBody.build();

Request request = new Request.Builder()
    .url(URL)
    .post(rb)
    .build();   

try {
    Response mResponse = mOkHttpClient.newCall(request).execute();
        if (!mResponse.isSuccessful()) throw new IOException();

        responseMsg = mResponse.body().string();

} catch (IOException e) {
    responseMsg = timeoutMessage;
}

return responseMsg;

【问题讨论】:

  • mRequestBody.addFormDataPart("IMAGE2", "IMAGE2", imageBody);为什么你使用两个“IMAGE2”键?
  • 无关:这是在乞求 for 循环。
  • @Make it Simple:一是获取数据的键,二是文件名。这是我第一次使用多部分数据和 okhttp,okhttp 的配方页面也使用硬编码字符串作为文件名传递,我在 qus 中提到的链接问题也做了同样的事情。
  • @EugenPechanec:是的,我首先尝试使用循环,然后认为可能是循环导致问题,所以使用 if。排序后将再次使用循环。

标签: java android image-uploading multipart okhttp


【解决方案1】:

首先你的代码中有几个错误

检查媒体类型检查的地方,总是相同的列表元素(应该是索引1、2、3等)

   if (Imagepaths.size() > 1) {
        File file = new File(Imagepaths.get(1));

        MEDIA_TYPE = Imagepaths.get(0).endsWith("png") ? 
                MediaType.parse("image/png") : MediaType.parse("image/jpeg");


        RequestBody imageBody = RequestBody.create(MEDIA_TYPE, file);
        mRequestBody.addFormDataPart("IMAGE2", "IMAGE2", imageBody);
    }

第二,mRequestBody.addFormDataPart("IMAGE2", "IMAGE2", imageBody); 您的图像有名称 IMAGE1、IMAGE2 等吗?

【讨论】:

  • 我在脑海中的某个地方知道我做错了什么,这就是为什么在这种情况下使用循环。我纠正了 MEDIA_TYPE 的事情,但问题仍然存在。不,我的图像没有 IMAGE1、IMAGE2... 名称,但我经历的其他示例使用了硬编码字符串。另外,说实话,我不知道为什么“mRequestBody.addFormDataPart("IMAGE2", "IMAGE2", imageBody);" 中的第二个参数用来。图片的名称会在服务器端根据表中的ID进行更改。
  • 第一个参数是服务器的键(如字典/地图中)。第二个参数 - 你需要写下你上传的文件名(比如“image_2.png”)
  • 感谢您的帮助,这是我做错了文件名的事情。将第二个参数替换为 file.getName();它奏效了。再次感谢。
猜你喜欢
  • 2016-06-07
  • 1970-01-01
  • 2015-08-01
  • 2021-01-19
  • 1970-01-01
  • 1970-01-01
  • 2014-06-24
  • 2019-03-24
相关资源
最近更新 更多