Skip to content

Commit 909128d

Browse files
Merge pull request #318 from amitshekhariitbhu/development
Add support for multi contentType and multiple files with same key
2 parents 7613161 + b35b47a commit 909128d

File tree

18 files changed

+938
-40
lines changed

18 files changed

+938
-40
lines changed

CHANGELOG.md

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,15 @@
11
Change Log
22
==========
33

4+
Version 1.0.2 *(2018-07-10)*
5+
----------------------------
6+
7+
* New: Add support for multiple file upload with same key
8+
* New: Add support for multi contentType in multipart
9+
* Bump OkHttp Version to 3.10.0
10+
* Bump other dependencies
11+
12+
413
Version 1.0.1 *(2017-12-20)*
514
----------------------------
615

README.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ Fast Android Networking Library supports Android 2.3 (Gingerbread) and later.
5757

5858
Add this in your build.gradle
5959
```groovy
60-
compile 'com.amitshekhar.android:android-networking:1.0.1'
60+
compile 'com.amitshekhar.android:android-networking:1.0.2'
6161
```
6262
Do not forget to add internet permission in manifest if already not present
6363
```xml
@@ -77,7 +77,7 @@ AndroidNetworking.initialize(getApplicationContext(),okHttpClient);
7777
```
7878
Using the Fast Android Networking with Jackson Parser
7979
```groovy
80-
compile 'com.amitshekhar.android:jackson-android-networking:1.0.1'
80+
compile 'com.amitshekhar.android:jackson-android-networking:1.0.2'
8181
```
8282
```java
8383
// Then set the JacksonParserFactory like below

android-networking/src/main/java/com/androidnetworking/common/ANRequest.java

Lines changed: 111 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,8 @@
4040
import com.androidnetworking.interfaces.UploadProgressListener;
4141
import com.androidnetworking.internal.ANRequestQueue;
4242
import com.androidnetworking.internal.SynchronousCall;
43+
import com.androidnetworking.model.MultipartFileBody;
44+
import com.androidnetworking.model.MultipartStringBody;
4345
import com.androidnetworking.utils.ParseUtil;
4446
import com.androidnetworking.utils.Utils;
4547
import com.google.gson.internal.$Gson$Types;
@@ -89,10 +91,10 @@ public class ANRequest<T extends ANRequest> {
8991
private HashMap<String, List<String>> mHeadersMap = new HashMap<>();
9092
private HashMap<String, String> mBodyParameterMap = new HashMap<>();
9193
private HashMap<String, String> mUrlEncodedFormBodyParameterMap = new HashMap<>();
92-
private HashMap<String, String> mMultiPartParameterMap = new HashMap<>();
94+
private HashMap<String, MultipartStringBody> mMultiPartParameterMap = new HashMap<>();
9395
private HashMap<String, List<String>> mQueryParameterMap = new HashMap<>();
9496
private HashMap<String, String> mPathParameterMap = new HashMap<>();
95-
private HashMap<String, File> mMultiPartFileMap = new HashMap<>();
97+
private HashMap<String, List<MultipartFileBody>> mMultiPartFileMap = new HashMap<>();
9698
private String mDirPath;
9799
private String mFileName;
98100
private String mApplicationJsonString = null;
@@ -849,22 +851,34 @@ public RequestBody getRequestBody() {
849851
}
850852

851853
public RequestBody getMultiPartRequestBody() {
852-
MultipartBody.Builder builder = new MultipartBody
853-
.Builder()
854+
MultipartBody.Builder builder = new MultipartBody.Builder()
854855
.setType((customMediaType == null) ? MultipartBody.FORM : customMediaType);
855856
try {
856-
for (HashMap.Entry<String, String> entry : mMultiPartParameterMap.entrySet()) {
857+
for (HashMap.Entry<String, MultipartStringBody> entry : mMultiPartParameterMap.entrySet()) {
858+
MultipartStringBody stringBody = entry.getValue();
859+
MediaType mediaType = null;
860+
if (stringBody.contentType != null) {
861+
mediaType = MediaType.parse(stringBody.contentType);
862+
}
857863
builder.addPart(Headers.of("Content-Disposition",
858864
"form-data; name=\"" + entry.getKey() + "\""),
859-
RequestBody.create(null, entry.getValue()));
860-
}
861-
for (HashMap.Entry<String, File> entry : mMultiPartFileMap.entrySet()) {
862-
String fileName = entry.getValue().getName();
863-
RequestBody fileBody = RequestBody.create(MediaType.parse(Utils.getMimeType(fileName)),
864-
entry.getValue());
865-
builder.addPart(Headers.of("Content-Disposition",
866-
"form-data; name=\"" + entry.getKey() + "\"; filename=\"" + fileName + "\""),
867-
fileBody);
865+
RequestBody.create(mediaType, stringBody.value));
866+
}
867+
for (HashMap.Entry<String, List<MultipartFileBody>> entry : mMultiPartFileMap.entrySet()) {
868+
List<MultipartFileBody> fileBodies = entry.getValue();
869+
for (MultipartFileBody fileBody : fileBodies) {
870+
String fileName = fileBody.file.getName();
871+
MediaType mediaType;
872+
if (fileBody.contentType != null) {
873+
mediaType = MediaType.parse(fileBody.contentType);
874+
} else {
875+
mediaType = MediaType.parse(Utils.getMimeType(fileName));
876+
}
877+
RequestBody requestBody = RequestBody.create(mediaType, fileBody.file);
878+
builder.addPart(Headers.of("Content-Disposition",
879+
"form-data; name=\"" + entry.getKey() + "\"; filename=\"" + fileName + "\""),
880+
requestBody);
881+
}
868882
}
869883
} catch (Exception e) {
870884
e.printStackTrace();
@@ -1602,10 +1616,10 @@ public static class MultiPartBuilder<T extends MultiPartBuilder> implements Requ
16021616
private String mUrl;
16031617
private Object mTag;
16041618
private HashMap<String, List<String>> mHeadersMap = new HashMap<>();
1605-
private HashMap<String, String> mMultiPartParameterMap = new HashMap<>();
16061619
private HashMap<String, List<String>> mQueryParameterMap = new HashMap<>();
16071620
private HashMap<String, String> mPathParameterMap = new HashMap<>();
1608-
private HashMap<String, File> mMultiPartFileMap = new HashMap<>();
1621+
private HashMap<String, MultipartStringBody> mMultiPartParameterMap = new HashMap<>();
1622+
private HashMap<String, List<MultipartFileBody>> mMultiPartFileMap = new HashMap<>();
16091623
private CacheControl mCacheControl;
16101624
private int mPercentageThresholdForCancelling = 0;
16111625
private Executor mExecutor;
@@ -1768,34 +1782,100 @@ public T setUserAgent(String userAgent) {
17681782
}
17691783

17701784
public T addMultipartParameter(String key, String value) {
1771-
mMultiPartParameterMap.put(key, value);
1785+
return addMultipartParameter(key, value, null);
1786+
}
1787+
1788+
public T addMultipartParameter(String key, String value, String contentType) {
1789+
MultipartStringBody stringBody = new MultipartStringBody(value, contentType);
1790+
mMultiPartParameterMap.put(key, stringBody);
17721791
return (T) this;
17731792
}
17741793

17751794
public T addMultipartParameter(Map<String, String> multiPartParameterMap) {
1795+
return addMultipartParameter(multiPartParameterMap, null);
1796+
}
1797+
1798+
public T addMultipartParameter(Map<String, String> multiPartParameterMap, String contentType) {
17761799
if (multiPartParameterMap != null) {
1777-
mMultiPartParameterMap.putAll(multiPartParameterMap);
1800+
Map<String, MultipartStringBody> parameterMap = new HashMap<>();
1801+
for (HashMap.Entry<String, String> entry : multiPartParameterMap.entrySet()) {
1802+
MultipartStringBody stringBody = new MultipartStringBody(entry.getValue(), contentType);
1803+
parameterMap.put(entry.getKey(), stringBody);
1804+
}
1805+
mMultiPartParameterMap.putAll(parameterMap);
17781806
}
17791807
return (T) this;
17801808
}
17811809

17821810
public T addMultipartParameter(Object object) {
1811+
return addMultipartParameter(object, null);
1812+
}
1813+
1814+
public T addMultipartParameter(Object object, String contentType) {
17831815
if (object != null) {
1784-
mMultiPartParameterMap.putAll(ParseUtil
1816+
Map<String, String> parameterMap = ParseUtil
17851817
.getParserFactory()
1786-
.getStringMap(object));
1818+
.getStringMap(object);
1819+
addMultipartParameter(parameterMap, contentType);
17871820
}
17881821
return (T) this;
17891822
}
17901823

17911824
public T addMultipartFile(String key, File file) {
1792-
mMultiPartFileMap.put(key, file);
1825+
return addMultipartFile(key, file, null);
1826+
}
1827+
1828+
public T addMultipartFile(String key, File file, String contentType) {
1829+
MultipartFileBody fileBody = new MultipartFileBody(file, contentType);
1830+
addMultipartFileWithKey(key, fileBody);
17931831
return (T) this;
17941832
}
17951833

17961834
public T addMultipartFile(Map<String, File> multiPartFileMap) {
1835+
return addMultipartFile(multiPartFileMap, null);
1836+
}
1837+
1838+
public T addMultipartFile(Map<String, File> multiPartFileMap, String contentType) {
17971839
if (multiPartFileMap != null) {
1798-
mMultiPartFileMap.putAll(multiPartFileMap);
1840+
for (HashMap.Entry<String, File> entry : multiPartFileMap.entrySet()) {
1841+
MultipartFileBody fileBody = new MultipartFileBody(entry.getValue(), contentType);
1842+
addMultipartFileWithKey(entry.getKey(), fileBody);
1843+
}
1844+
}
1845+
return (T) this;
1846+
}
1847+
1848+
public T addMultipartFileList(String key, List<File> files) {
1849+
return addMultipartFileList(key, files, null);
1850+
}
1851+
1852+
public T addMultipartFileList(String key, List<File> files, String contentType) {
1853+
if (files != null) {
1854+
for (File file : files) {
1855+
MultipartFileBody fileBody = new MultipartFileBody(file, contentType);
1856+
addMultipartFileWithKey(key, fileBody);
1857+
}
1858+
}
1859+
return (T) this;
1860+
}
1861+
1862+
public T addMultipartFileList(Map<String, List<File>> multiPartFileMap) {
1863+
return addMultipartFileList(multiPartFileMap, null);
1864+
}
1865+
1866+
public T addMultipartFileList(Map<String, List<File>> multiPartFileMap, String contentType) {
1867+
if (multiPartFileMap != null) {
1868+
Map<String, List<MultipartFileBody>> parameterMap = new HashMap<>();
1869+
for (HashMap.Entry<String, List<File>> entry : multiPartFileMap.entrySet()) {
1870+
List<File> files = entry.getValue();
1871+
List<MultipartFileBody> fileBodies = new ArrayList<>();
1872+
for (File file : files) {
1873+
MultipartFileBody fileBody = new MultipartFileBody(file, contentType);
1874+
fileBodies.add(fileBody);
1875+
}
1876+
parameterMap.put(entry.getKey(), fileBodies);
1877+
}
1878+
mMultiPartFileMap.putAll(parameterMap);
17991879
}
18001880
return (T) this;
18011881
}
@@ -1810,6 +1890,15 @@ public T setContentType(String contentType) {
18101890
return (T) this;
18111891
}
18121892

1893+
private void addMultipartFileWithKey(String key, MultipartFileBody fileBody) {
1894+
List<MultipartFileBody> fileBodies = mMultiPartFileMap.get(key);
1895+
if (fileBodies == null) {
1896+
fileBodies = new ArrayList<>();
1897+
}
1898+
fileBodies.add(fileBody);
1899+
mMultiPartFileMap.put(key, fileBodies);
1900+
}
1901+
18131902
public ANRequest build() {
18141903
return new ANRequest(this);
18151904
}
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package com.androidnetworking.model;
2+
3+
import java.io.File;
4+
5+
public class MultipartFileBody {
6+
7+
public final File file;
8+
public final String contentType;
9+
10+
public MultipartFileBody(File file, String contentType) {
11+
this.file = file;
12+
this.contentType = contentType;
13+
}
14+
15+
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package com.androidnetworking.model;
2+
3+
public class MultipartStringBody {
4+
5+
public final String value;
6+
public final String contentType;
7+
8+
public MultipartStringBody(String value, String contentType) {
9+
this.value = value;
10+
this.contentType = contentType;
11+
}
12+
13+
}

android-networking/upload.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ def siteUrl = 'https://github.com/amitshekhariitbhu/Fast-Android-Networking'
2222
def gitUrl = 'https://github.com/amitshekhariitbhu/Fast-Android-Networking.git'
2323

2424
group = "com.amitshekhar.android"
25-
version = '1.0.1'
25+
version = '1.0.2'
2626

2727
install {
2828
repositories.mavenInstaller {

app/src/main/java/com/networking/ApiTestActivity.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -433,9 +433,11 @@ public void onError(ANError error) {
433433
}
434434

435435
public void uploadImage(final View view) {
436+
final String key = "image";
437+
final File file = new File(Environment.getExternalStorageDirectory().getAbsolutePath(), "test.png");
436438
AndroidNetworking.upload(ApiEndPoint.BASE_URL + ApiEndPoint.UPLOAD_IMAGE)
437439
.setPriority(Priority.MEDIUM)
438-
.addMultipartFile("image", new File(Environment.getExternalStorageDirectory().getAbsolutePath(), "test.png"))
440+
.addMultipartFile(key, file)
439441
.setTag(this)
440442
.build()
441443
.setAnalyticsListener(new AnalyticsListener() {

app/src/main/java/com/networking/OkHttpResponseTestActivity.java

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1059,6 +1059,22 @@ public void onReceived(long timeTakenInMillis, long bytesSent, long bytesReceive
10591059
}).start();
10601060
}
10611061

1062+
public void checkOptionsRequest(View view) {
1063+
AndroidNetworking.options("https://api.github.com/square/okhttp/issues")
1064+
.build()
1065+
.getAsOkHttpResponse(new OkHttpResponseListener() {
1066+
@Override
1067+
public void onResponse(Response response) {
1068+
Log.d(TAG, "response : " + response.headers().toString());
1069+
}
1070+
1071+
@Override
1072+
public void onError(ANError anError) {
1073+
Utils.logError(TAG, anError);
1074+
}
1075+
});
1076+
}
1077+
10621078
public void getCurrentConnectionQuality(View view) {
10631079
Log.d(TAG, "getCurrentConnectionQuality : " + AndroidNetworking.getCurrentConnectionQuality() + " currentBandwidth : " + AndroidNetworking.getCurrentBandwidth());
10641080
}

build.gradle

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ buildscript {
2323
google()
2424
}
2525
dependencies {
26-
classpath 'com.android.tools.build:gradle:2.3.2'
26+
classpath 'com.android.tools.build:gradle:3.1.0'
2727
classpath 'com.jfrog.bintray.gradle:gradle-bintray-plugin:1.4'
2828
classpath 'com.github.dcendents:android-maven-gradle-plugin:1.4.1'
2929
// NOTE: Do not place your application dependencies here; they belong
@@ -47,17 +47,17 @@ ext {
4747
compileSdkVersion = 27
4848
minSdkVersion = 14
4949
targetSdkVersion = 27
50-
buildToolsVersion = "26.0.2"
50+
buildToolsVersion = "27.0.3"
5151

5252
// App dependencies versions
53-
okHttp3Version = "3.9.1"
53+
okHttp3Version = "3.10.0"
5454
gsonVersion = "2.8.2"
5555
jacksonVersion = "2.8.2"
56-
rxJavaVersion = "1.3.4"
56+
rxJavaVersion = "1.3.8"
5757
rxJavaAndroidVersion = "1.2.1"
58-
rxJava2Version = "2.1.7"
59-
rxJava2AndroidVersion = "2.0.1"
58+
rxJava2Version = "2.1.12"
59+
rxJava2AndroidVersion = "2.0.2"
6060
jUnitVersion = "4.12"
61-
mockWebServerVersion = "3.9.1"
62-
supportAppCompatVersion = "27.0.2"
61+
mockWebServerVersion = "3.10.0"
62+
supportAppCompatVersion = "27.1.1"
6363
}
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
#Wed Dec 06 17:39:39 MST 2017
1+
#Thu Apr 12 21:48:48 IST 2018
22
distributionBase=GRADLE_USER_HOME
33
distributionPath=wrapper/dists
44
zipStoreBase=GRADLE_USER_HOME
55
zipStorePath=wrapper/dists
6-
distributionUrl=https\://services.gradle.org/distributions/gradle-4.1-all.zip
6+
distributionUrl=https\://services.gradle.org/distributions/gradle-4.4-all.zip

0 commit comments

Comments
 (0)