4040import com .androidnetworking .interfaces .UploadProgressListener ;
4141import com .androidnetworking .internal .ANRequestQueue ;
4242import com .androidnetworking .internal .SynchronousCall ;
43+ import com .androidnetworking .model .MultipartFileBody ;
44+ import com .androidnetworking .model .MultipartStringBody ;
4345import com .androidnetworking .utils .ParseUtil ;
4446import com .androidnetworking .utils .Utils ;
4547import 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 }
0 commit comments