【问题标题】:Uploading multiple images with volley?用凌空上传多张图片?
【发布时间】:2016-03-19 12:40:24
【问题描述】:

我在 SO 和其他 tuts 中也浏览过很多帖子。但我无法获得任何最新的官方或其他不包含任何使用 volley 上传多个图像的过时代码的帖子。我开始知道在新的 android M 中删除和相关的 Apache HTTP 客户端,更喜欢在下面使用。

android {
    useLibrary 'org.apache.http.legacy'
}  

那么,任何人都可以帮助我使用新更新的已弃用的少排球类进行多张图片上传吗?

【问题讨论】:

标签: java android android-volley multipart


【解决方案1】:

此时,Volley 库(Google 的和 mcxiaoke 的库)仍然在其许多类中使用 Apache 的库。如果你仍然想使用 Volley没有任何 Apache 依赖,你需要在你的项目中使用它作为一个模块并修改它的源代码文件。

你可以参考my GitHub sample code ,在那里你会发现我已经定制了一些类,如NetworkResponseHttpHeaderParserBasicNetworkHurlStackVolley...使用MultipartActivity.java 文件。

你会看到build.gradle文件内容:

apply plugin: 'com.android.application'

android {
    compileSdkVersion 23
    buildToolsVersion "23.0.2"

    defaultConfig {
        applicationId "com.example.volleynoapache"
        minSdkVersion 16
        targetSdkVersion 23
        versionCode 1
        versionName "1.0"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    testCompile 'junit:junit:4.12'
    compile 'com.android.support:appcompat-v7:23.1.1'
}

恕我直言,另一个很好的替代解决方案正在使用 OkHttp,我在 GitHub 也有一个工作示例代码,请看一下。

希望对你有帮助!

【讨论】:

  • 感谢您的帮助 BNK。但实际上我想使用 Apache 依赖项来解决这个问题。
  • 哦!那么deprecated less 是什么意思?如果仍然想要,请阅读我的链接stackoverflow.com/questions/32240177/…
【解决方案2】:

您可以使用here的最新版本的volley。这是一个非官方镜像,修复了一些小错误,源代码将定期与官方volley存储库同步。

用于 Gradle

compile 'com.mcxiaoke.volley:library:1.0.19' 

或者你可以从here下载编译后的版本

现在,您可以在org.apache.http.entity.mime 中的MultipartEntityBuilder 的帮助下,使用下面的附加类使用凌空发出多部分请求,而无需任何已弃用的代码。

CustomMultipartRequest.java

使用示例

//Auth header
Map<String, String> mHeaderPart= new HashMap<>();
mHeaderPart.put("Content-type", "multipart/form-data;");
mHeaderPart.put("access_token", accessToken);

//File part
Map<String, File> mFilePartData= new HashMap<>();
mFilePartData.put("file", new File(mFilePath));
mFilePartData.put("file", new File(mFilePath));

//String part
Map<String, String> mStringPart= new HashMap<>();
mStringPart.put("profile_id","1");
mStringPart.put("imageType", "ProfileImage");

CustomMultipartRequest mCustomRequest = new CustomMultipartRequest(method, mContext, url, new Response.Listener<JSONObject>() {
            @Override
            public void onResponse(JSONObject jsonObject) {
                listener.onResponse(jsonObject);
            }
        }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError volleyError) {
                listener.onErrorResponse(volleyError);
            }
        }, mFilePartData, mStringPart, mHeaderPart);

您可以使用httpmime-4.3.5.jarhttpcore-4.3.2.jar 访问MultipartEntityBuilder 和其他用于发出请求的方法,或者如果您的目标API 23 及以上,则在您的gradle 中添加以下内容。

android {
    useLibrary 'org.apache.http.legacy'
}  

我使用上述 jar 的任何方式,它在 Android M 中也像魅力一样工作。

更新

请注意,com.mcxiaoke.volley:library:1.0.19 已弃用且不再维护,请使用jCenter 的官方版本。

compile 'com.android.volley:volley:1.0.0'

【讨论】:

  • 谢谢@Anoop M,它可以在没有任何弃用代码的情况下工作。 :)
  • 其实mcxiaoke的Volley还是用API22的,大家可以在github.com/mcxiaoke/android-volley/blob/master/…看到:)
  • 是否可以上传多个具有相同密钥“文件”的文件?
  • 正如他在答案更新中解释的那样,您可以使用官方版本的 volley 而不是尝试使用已弃用的版本。
猜你喜欢
  • 1970-01-01
  • 2019-11-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多