2016-04-09 1 views
4

Я использую класс MultiPartRequester для загрузки многостраничного изображения на сервер, но я обнаружил, что часть устарела в этом. например, HttpConnectionParams, getConnectionManager() и т. д., так что у кого-нибудь есть новое решение, которое не устарело с новым уровнем API для загрузки файлов?Загрузка многопользовательского изображения Android с помощью HttpConnectionParams не рекомендуется в новых api

Я использую этот код.

public class MultiPartRequester { 
 
\t private Map<String, String> map; 
 
\t private AsyncTaskCompleteListener mAsynclistener; 
 
\t private int serviceCode; 
 
\t private HttpClient httpclient; 
 
\t private Activity activity; 
 
\t private AsyncHttpRequest request; 
 
\t private static final String TAG = "MultiPartRequester"; 
 

 
\t public MultiPartRequester(Activity activity, Map<String, String> map, 
 
\t \t int serviceCode, AsyncTaskCompleteListener asyncTaskCompleteListener) { 
 
\t \t this.map = map; 
 
\t \t this.serviceCode = serviceCode; 
 
\t \t this.activity = activity; 
 
\t } 
 

 
\t class AsyncHttpRequest extends AsyncTask<String, Void, String> { 
 
\t \t @Override 
 
\t \t protected String doInBackground(String... urls) { 
 
\t \t \t map.remove("url"); 
 
\t \t \t try { 
 
\t \t \t \t HttpPost httppost = new HttpPost(urls[0]); 
 
\t \t \t \t httpclient = new DefaultHttpClient(); 
 
\t \t \t \t HttpConnectionParams.setConnectionTimeout(
 
\t \t \t \t \t \t httpclient.getParams(), 600000); 
 
\t \t \t \t MultipartEntityBuilder builder = MultipartEntityBuilder 
 
\t \t \t \t \t \t .create(); 
 
\t \t \t \t for (String key : map.keySet()) { 
 
\t \t \t \t \t if (key.equalsIgnoreCase(AndyConstants.Params.PICTURE)) { 
 
\t \t \t \t \t \t File f = new File(map.get(key)); 
 
\t \t \t \t \t \t builder.addBinaryBody(key, f, 
 
\t \t \t \t \t \t \t \t ContentType.MULTIPART_FORM_DATA, f.getName()); 
 
\t \t \t \t \t } else { 
 
\t \t \t \t \t \t builder.addTextBody(key, map.get(key), ContentType 
 
\t \t \t \t \t \t \t \t .create("text/plain", MIME.UTF8_CHARSET)); 
 
\t \t \t \t \t } 
 
\t \t \t \t \t AppLog.Log(TAG, key + "---->" + map.get(key)); 
 
\t \t \t \t } 
 
\t \t \t \t httppost.setEntity(builder.build()); 
 
\t \t \t \t ActivityManager manager = (ActivityManager) activity 
 
\t \t \t \t \t \t .getSystemService(Context.ACTIVITY_SERVICE); 
 
\t \t \t \t if (manager.getMemoryClass() < 25) { 
 
\t \t \t \t \t System.gc(); 
 
\t \t \t \t } 
 
\t \t \t \t HttpResponse response = httpclient.execute(httppost); 
 
\t \t \t \t String responseBody = EntityUtils.toString(
 
\t \t \t \t \t \t response.getEntity(), "UTF-8"); 
 
\t \t \t \t reurn responseBody; 
 
\t \t \t } catch (Exception e) { 
 
\t \t \t \t e.printStackTrace(); 
 
\t \t \t } catch (OutOfMemoryError oume) { 
 
\t \t \t \t System.gc(); \t 
 
\t \t \t } finally { 
 
\t \t \t \t if (httpclient != null) 
 
\t \t \t \t \t httpclient.getConnectionManager().shutdown(); 
 
\t \t \t } 
 
\t \t \t return null; 
 
\t \t } 
 

 
\t \t @Override 
 
\t \t protected void onPostExecute(String response) { 
 
\t \t \t if (mAsynclistener != null) { 
 
\t \t \t \t mAsynclistener.onTaskCompleted(response, serviceCode); 
 
\t \t \t } 
 
\t \t } 
 
\t } 
 
\t public void cancelTask() { 
 
\t \t request.cancel(true); 
 
\t \t AppLog.Log(TAG, "task is canelled"); 
 
\t } 
 
}

+0

Я также ищет же .... – nidhi

+0

Для getConnectionManager() попробуйте эту ссылку: http://stackoverflow.com/questions/20713321/httpclient-getconnectionmanager-is-deprecated -what-should-be-used-вместо – Mrunal

+1

Я думаю, что этот ответ может помочь вам: http://stackoverflow.com/questions/32240177/working-post-multipart-request-with-volley-and-without-httpentity –

ответ

6

это FileUploadMultipartRequest класс:

/** 
* Multipart request for sending files over http 
* also can return generic type of response data 
* @param <T> the type of data for http responses 
*/ 
public class FileUploadMultipartRequest<T> extends BaseRequest<T> 
{ 
    private static final MediaType JSON = MediaType.parse("application/json"); 
    private File[] files; 
    private String jsonString; 
    private RequestBody requestBody; 

    public FileUploadMultipartRequest(String url, Map<String, String> headers, String jsonString, OnEmptyResponseListener listener, ErrorTypeListener errorListener, File... files) 
    { 
     super(Method.POST, url, headers, listener, new ErrorListenerImpl(errorListener)); 
     this.jsonString = jsonString; 
     this.files = files; 
    } 

    public FileUploadMultipartRequest(String url, Map<String, String> headers, String jsonString, Type responseType, Response.Listener listener, ErrorTypeListener errorListener, File... files) 
    { 
     super(Method.POST, url, headers, responseType, listener, new ErrorListenerImpl(errorListener)); 
     this.jsonString = jsonString; 
     this.files = files; 
    } 

    @Override 
    public String getBodyContentType() 
    { 
     return buildMultipartEntity().contentType().toString(); 
    } 

    @Override 
    public byte[] getBody() throws AuthFailureError 
    { 
     Buffer buffer = new Buffer(); 
     try 
     { 
      buildMultipartEntity().writeTo(buffer); 
     } catch (IOException e) 
     { 
      VolleyLog.e("IOException writing to ByteArrayOutputStream"); 
     } 
     return buffer.readByteArray(); 
    } 

    private RequestBody buildMultipartEntity() 
    { 

     if (requestBody == null) 
     { 
      MultipartBuilder multipartBuilder = new MultipartBuilder().type(MultipartBuilder.FORM); 

      multipartBuilder.addPart(
        Headers.of("Content-Disposition", "form-data; name=json-part"), 
        RequestBody.create(JSON, jsonString)); 

      for (File file : files) 
      { 
       String contentType = URLConnection.guessContentTypeFromName(file.getName()); 
       multipartBuilder.addFormDataPart("files-part", file.getName(), 
         RequestBody.create(MediaType.parse(contentType), file)); 
      } 

      requestBody = multipartBuilder.build(); 
     } 
     return requestBody; 
    } 

} 

это BaseRequest класс:

/** 
* this a abstract request class for handling http http responses 
* note : all volley request should extend this class for http request 
* 
* @param <T> the type of data for http responses 
*/ 
public abstract class BaseRequest<T> extends Request<T> 
{ 
    private final Map<String, String> headers; 

    /** 
    * the type response that {@link com.android.volley.Response.Listener} should return 
    */ 
    private Type responseType; 

    /** 
    * generic listener for successful http request 
    */ 
    private Response.Listener<T> listener; 

    /** 
    * constructor for request that returns data type {@link T} 
    * 
    * @param method  http verb e.g. POST, GET & etc 
    * @param url   request URL 
    * @param headers  http headers 
    * @param responseType type of data that response should return 
    * @param listener  event for successful request 
    * @param errorListener event for failed request 
    */ 
    public BaseRequest(int method, String url, Map<String, String> headers, Type responseType, Response.Listener listener, ErrorListenerImpl errorListener) 
    { 
     super(method, url, errorListener); 
     this.headers = headers; 
     this.responseType = responseType; 
     //noinspection unchecked 
     this.listener = listener; 
    } 

    /** 
    * constructor for requests with no returning data 
    * @param method     http verb e.g. POST, GET & etc 
    * @param url      request URL 
    * @param headers     http headers 
    * @param onEmptyResponseListener event for successful request (but no data return) 
    * @param errorListener   event for failed request 
    */ 
    public BaseRequest(int method, String url, Map<String, String> headers, OnEmptyResponseListener onEmptyResponseListener, ErrorListenerImpl errorListener) 
    { 
     super(method, url, errorListener); 
     this.headers = headers; 
     //noinspection unchecked 
     listener = new OnEmptyResponseImpl(onEmptyResponseListener); 
    } 

    protected Response<T> parseNetworkResponse(NetworkResponse response) 
    { 

     // if response type is null so just pass null to success event 
     if (this.responseType == null && new String(response.data).isEmpty()) 
     { 
      return Response.success(null, HttpHeaderParser.parseCacheHeaders(response)); 
     } 

     // if response type is specified 
     try 
     { 
      Gson gson = new Gson(); 
      String json = new String(response.data, HttpHeaderParser.parseCharset(response.headers)); 
      // we use GSON to reflect response data to the generic type and pass to success event 
      T parseObject = gson.fromJson(json, responseType); 
      return Response.success(parseObject, HttpHeaderParser.parseCacheHeaders(response)); 
     } catch (UnsupportedEncodingException e) 
     { 
      return Response.error(new ParseError(e)); 
     } catch (JsonSyntaxException e) 
     { 
      return Response.error(new ParseError(e)); 
     } 
    } 


    @Override 
    protected void deliverResponse(T response) 
    { 
     if (listener != null) 
     { 
      // call successful response event when listener not empty 
      listener.onResponse(response); 
     } 
    } 

    @Override 
    protected void onFinish() 
    { 
     super.onFinish(); 
     listener = null; 
    } 

    /** 
    * this class forward response event to {@link com.khosravi.mehrdadz.garagesale.Network.RequestType.BaseRequest.OnEmptyResponseListener} 
    * when volley {@link com.android.volley.Response.Listener} is called 
    */ 
    private static class OnEmptyResponseImpl implements Response.Listener 
    { 
     OnEmptyResponseListener onEmptyResponseListener; 

     /** 
     * @param onEmptyResponseListener interface for response with not data return 
     */ 
     public OnEmptyResponseImpl(OnEmptyResponseListener onEmptyResponseListener) 
     { 
      this.onEmptyResponseListener = onEmptyResponseListener; 
     } 

     /** 
     * we call {@link com.khosravi.mehrdadz.garagesale.Network.RequestType.BaseRequest.OnEmptyResponseImpl#onEmptyResponseListener} 
     * when volley listener is class so no null object passed to the event 
     * 
     * @param response 
     */ 
     @Override 
     public void onResponse(Object response) 
     { 
      onEmptyResponseListener.OnEmptyResponse(); 
     } 
    } 

    /** 
    * interface for http response with no returning data 
    */ 
    public interface OnEmptyResponseListener 
    { 
     void OnEmptyResponse(); 
    } 

    public Map<String, String> getHeaders() throws AuthFailureError 
    { 
     return this.headers != null ? this.headers : super.getHeaders(); 
    } 
} 

и это GsonRequest класс:

@SuppressWarnings("JavaDoc") 
/** 
* Gson request that return generic type of response data 
* @param <T> the type of data for http responses 
*/ 
public class GsonRequest<T> extends BaseRequest<T> 
{ 
    protected static final String PROTOCOL_CHARSET = "utf-8"; 
    /** 
    * Content type for request. 
    */ 
    private static final String PROTOCOL_CONTENT_TYPE = 
      String.format("application/json; charset=%s", PROTOCOL_CHARSET); 

    /** 
    * message body of http request 
    */ 
    private final String requestBody; 

    /** 
    * Request return response object of Type {@link T} 
    * @param url 
    * @param headers 
    * @param type 
    * @param listener 
    * @param errorListener 
    */ 
    public GsonRequest(String url, Map<String, String> headers, Type type, Listener<T> listener, ErrorTypeListener errorListener) 
    { 
     super(Method.GET, url, headers, type, listener, new ErrorListenerImpl(errorListener)); 
     requestBody = null; 
    } 

    /** 
    * Request return response object of Type {@link T} 
    * @param url 
    * @param headers 
    * @param jsonObject json object to send with request 
    * @param type 
    * @param listener 
    * @param errorListener 
    */ 
    public GsonRequest(String url, Map<String, String> headers, JSONObject jsonObject, Type type, Listener<T> listener, ErrorTypeListener errorListener) 
    { 
     super(Method.POST, url, headers, type, listener, new ErrorListenerImpl(errorListener)); 
     this.requestBody = jsonObject == null ? null : jsonObject.toString(); 
    } 

    /** 
    * Request return empty response 
    * @param url 
    * @param headers 
    * @param jsonObject json object to send with request 
    * @param listener 
    * @param errorListener 
    */ 
    public GsonRequest(String url, Map<String, String> headers, JSONObject jsonObject, OnEmptyResponseListener listener, ErrorTypeListener errorListener) 
    { 
     super(Method.POST, url, headers, listener, new ErrorListenerImpl(errorListener)); 
     this.requestBody = jsonObject == null ? null : jsonObject.toString(); 
    } 

    /** 
    * Request return empty response 
    * @param url 
    * @param headers 
    * @param listener 
    * @param errorListener 
    */ 
    public GsonRequest(String url, Map<String, String> headers, BaseRequest.OnEmptyResponseListener listener, ErrorTypeListener errorListener) 
    { 
     super(Method.GET, url, headers, listener, new ErrorListenerImpl(errorListener)); 
     requestBody = null; 
    } 


    @Override 
    public String getBodyContentType() 
    { 
     return PROTOCOL_CONTENT_TYPE; 
    } 

    @Override 
    public byte[] getBody() 
    { 
     try 
     { 
      return requestBody == null ? null : requestBody.getBytes(PROTOCOL_CHARSET); 
     } catch (UnsupportedEncodingException uee) 
     { 
      VolleyLog.wtf("Unsupported Encoding while trying to get the bytes of %s using %s", 
        requestBody, PROTOCOL_CHARSET); 
      return null; 
     } 
    } 
} 

образца трески:

public class MyRequest 
{ 
public MyRequest(Context context) 
    { 
     volleySingleton = VolleySingleton.getInstance(context); 
    } 
private static final String INSERT_NEW_PIC = "INSERT_NEW_PIC"; 
public void UploadNewPic(File[] Images, BaseRequest.OnEmptyResponseListener listener, ErrorTypeListener errorListener) 
    { 

     FileUploadMultipartRequest fileUploadMultipartRequest = new FileUploadMultipartRequest("url", null, null, listener, errorListener,Images); 
     volleySingleton.addToRequestQueue(fileUploadMultipartRequest, INSERT_NEW_PIC); 
    } 
} 

Вы можете добавить больше запросов на мой запрос и называть это в любом месте. так:

MyRequest myRequest; 
private HashMap<FrameLayout,File> Images; 

myRequest = new MyRequest(context); 
Images = new HashMap<>(); 

myRequest.UploadNewPic(Images.values().toArray(new File[Images.values().size()]), new BaseRequest.OnEmptyResponseListener() 
        { 
         @Override 
         public void OnEmptyResponse() 
         { 
          Toast.makeText(getApplicationContext(), "added pics successfully", Toast.LENGTH_LONG).show(); 
          finish(); 
         } 
        }, new ErrorTypeListener() 
        { 
         @Override 
         public void onError(ErrorType errorType) 
         { 

         } 
        }); 

стороне сервера треска (.нетто):

public class CustomMultipartFormDataStreamProvider : MultipartFormDataStreamProvider 
    { 
     public CustomMultipartFormDataStreamProvider(string path) : base(path) { } 


     //below only allows images and pdf files to be uploaded. 
     public override Stream GetStream(HttpContent parent, System.Net.Http.Headers.HttpContentHeaders headers) 
     { 

      // following line handles other form fields other than files. 
      if (String.IsNullOrEmpty(headers.ContentDisposition.FileName)) return base.GetStream(parent, headers); 

      // restrict what filetypes can be uploaded 
      List<string> extensions = new List<string> { "png", "gif", 
       "jpg", "jpeg", "tiff", "pdf", "tif", "bmp","doc","docx","ods","xls","odt","csv","txt","rtf" }; 
      var filename = headers.ContentDisposition.FileName.Replace("\"", string.Empty); // correct for chrome. 

      //make sure it has an extension 
      if (filename.IndexOf('.') < 0) 
      { 
       return Stream.Null; 
      } 

      //get the extension 
      var extension = filename.Split('.').Last(); 

      //Return stream if match otherwise return null stream. 
      return extensions.Contains(extension) ? base.GetStream(parent, headers) : Stream.Null; 

     } 

     public override string GetLocalFileName(System.Net.Http.Headers.HttpContentHeaders headers) 
     { 
      var name = !string.IsNullOrWhiteSpace(headers.ContentDisposition.FileName) ? headers.ContentDisposition.FileName : "NoName"; 
      name = name.Replace("\"", string.Empty); 
      //name = (Guid.NewGuid()).ToString() +System.IO.Path.GetExtension(name); //this is here because Chrome submits files in quotation marks which get treated as part of the filename and get escaped 

      name = Path.GetRandomFileName().Replace(".", string.Empty) + Path.GetExtension(name); //this is here because Chrome submits files in quotation marks which get treated as part of the filename and get escaped 

      return name; 
     } 
    } 

общественного класса ImageRouteHandler:

IRouteHandler 
{ 

    public IHttpHandler GetHttpHandler(RequestContext requestContext) 
    { 
     var filename = requestContext.RouteData.Values["filename"] as string; 
     var section = requestContext.RouteData.Values["section"] as string; 

     if (string.IsNullOrEmpty(filename) && string.IsNullOrEmpty(section)) 
     { 
      // return a 404 HttpHandler here 
      requestContext.HttpContext.Response.StatusCode = 404; 
      requestContext.HttpContext.Response.End(); 
      return null; 
     } 

     requestContext.HttpContext.Response.Clear(); 
     requestContext.HttpContext.Response.Cache.SetMaxAge(TimeSpan.FromSeconds(500000)); 
     requestContext.HttpContext.Response.Cache.SetCacheability(HttpCacheability.Public); 

     requestContext.HttpContext.Response.ContentType = GetContentType(filename); 

     // find physical path to image here. 
     var path = GetPath(section); 

     if (string.IsNullOrEmpty(path)) 
     { 
      // return a 404 HttpHandler here 
      requestContext.HttpContext.Response.StatusCode = 404; 
      requestContext.HttpContext.Response.End(); 
      return null; 
     } 

     var filepath = requestContext.HttpContext.Server.MapPath(path + filename); 
     requestContext.HttpContext.Response.WriteFile(filepath); 
     requestContext.HttpContext.Response.End(); 
     return null; 
    } 

    private static string GetPath(string section) 
    { 
     switch (section) 
     { 
      case "user": 
       return "~/Resources/Users/";//where you want save pics in project 
     } 
     return ""; 
    } 


    private static string GetContentType(string path) 
    { 
     switch (Path.GetExtension(path)) 
     { 
      case ".bmp": 
       return "Image/bmp"; 
      case ".gif": 
       return "Image/gif"; 
      case ".jpg": 
       return "Image/jpeg"; 
      case ".png": 
       return "Image/png"; 
     } 
     return ""; 
    } 
} 

и изменить RouteConfige так:

public class RouteConfig 
    { 
     public static void RegisterRoutes(RouteCollection routes) 
     { 
      routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 

      // proccess all for protected resources with ImageRouteHandler 
      routes.Add("ImagesRoute", new Route("res/{section}/{filename}", new ImageRouteHandler())); 

      routes.MapRoute(
       name: "Default", 
       url: "{controller}/{action}/{id}", 
       defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } 
      ); 
     } 
    } 

пример кода для серверной части:

public interface IUserManagement 
    { 
     void UploadNewPics(IEnumerable<string> imageUrls); 
    } 



    public class UserManagement : IUserManagement 
    { 
     public void UploadNewPics(IEnumerable<string> imageUrls) 
     { 

      using (var ctx = new Context()) 
      { 

       foreach (var imageUrl in imageUrls) 
       { 
        //save to data base 
        . 
        . 
        . 
       } 

       try 
       { 
        ctx.SaveChanges(); 
       } 
       catch (Exception e) 
       { 
        throw; 
       } 
      } 
     } 
    } 



     public class UserApiController : ApiController 
{ 
    [HttpPost] 
    public async Task<IHttpActionResult> UploadNewPics() 
    { 
     if (!Request.Content.IsMimeMultipartContent()) 
     { 
      throw new HttpResponseException(HttpStatusCode.UnsupportedMediaType); 
     } 

     var root = HttpContext.Current.Server.MapPath("~/Resources/Users/"); 
     var provider = new CustomMultipartFormDataStreamProvider(root); 
     try 
     { 
      // Read the form data. 
      await Request.Content.ReadAsMultipartAsync(provider); 

      IUserManagement userManagement = new UserManagement(); 

      var imageUrls = provider.FileData.Select(x=> Path.GetFileName(x.LocalFileName)); 
      //userManagement.UploadUserImage(uploadImageJson, Path.GetFileName(imageFile.LocalFileName), (long)imageFile.Headers.ContentLength); 
      userManagement.UploadNewPics(imageUrls); 
     } 
     catch (Exception e) 
     { 
      return InternalServerError(); 
     } 
     return Ok(); 
    } 
} 
+1

, если вам нужна пробная треска для их использования, просто дайте мне знать –

+1

да, пожалуйста, отправьте пример кода, как его использовать. – nidhi

+0

lol.i действительно отредактировал мой ответ спустя 30 минут. Вы видите это? –

2

Да как Apache HTTPClient осуждается теперь вы можете использовать HttpURLConnection Я использовал этот код для отправки нескольких файлов через Gmail с помощью SMTP, Вы изменить код и использовать его!

public class sendMails extends AsyncTask<String, String, String> { 
    ProgressDialog progress; 

    public sendMails(Context context) { 
     progress = new ProgressDialog(context); 
    } 

    @Override 
    protected void onPreExecute() { 
     progress.setMessage("Contacting Server!" + "\nPlease make sure internet is working!"); 
     progress.setProgressStyle(ProgressDialog.STYLE_SPINNER); 
     progress.setIndeterminate(true); 
     progress.show(); 
     progress.setCancelable(false); 
    } 

    @Override 
    protected String doInBackground(String... params) { 
     System.out.println("asd"); 
     // Get system properties 
     Properties props = System.getProperties(); 
     props.put("mail.smtp.host", "smtp.gmail.com"); 
     props.put("mail.smtp.socketFactory.port", "465"); 
     props.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory"); 
     props.put("mail.smtp.auth", "true"); 
     props.put("mail.smtp.port", "465"); 

     // Get session 

     Session session = Session.getDefaultInstance(props, new javax.mail.Authenticator() { 
      protected PasswordAuthentication getPasswordAuthentication() { 
       return new PasswordAuthentication("EMAIL ADDRESS", "password"); 


// return new PasswordAuthentication("", "password"); 
      } 
     }); 
     try { 
      // Define message 
      MimeMessage message = new MimeMessage(session); 

      message.setFrom(new InternetAddress("EMAIL ADDRESS")); 

      // Set To: header field of the header. 
      message.setRecipients(Message.RecipientType.TO, 
        InternetAddress.parse(email)); 


      message.setSubject("Your Photos"); 
      String text = "Content"; 
      message.setText(text); 
      Multipart multipart = new MimeMultipart("mixed"); 
      for (String str : listOfImages) { 
       System.out.println(str); 
       MimeBodyPart messageBodyPart = new MimeBodyPart(); 
       DataSource source = new FileDataSource(str); 
       messageBodyPart.setDataHandler(new DataHandler(source)); 
       messageBodyPart.setFileName(source.getName()); 
       multipart.addBodyPart(messageBodyPart); 
      } 

      message.setContent(multipart); 
      // Send message 
      Transport.send(message); 
     } catch (AddressException e) { 
      e.printStackTrace(); 
     } catch (MessagingException e) { 
      e.printStackTrace(); 
     } 
     return ""; 
    } 

    @Override 
    protected void onPostExecute(String s) { 

     setupScreenOnReciever(); 

     progress.dismiss(); 
    } 

} 
3

ИМО, вы должны использовать один из f ollowing:

  1. OkHttp

  2. Retrofit

  3. Google's Volley

С Volley и Модернизированный, йон может читать мои ответы на Working POST Multipart Request with Volley and without HttpEntity и Retrofit - Multipart request: Required MultipartFile parameter 'file' is not present

Regaring OkHttp, пожалуйста, попробуйте My GitHub sample project с основным примером кодом, как:

// Multipart request, upload file... 
     Drawable drawable = ContextCompat.getDrawable(mContext, R.drawable.ic_launcher); 
     if (drawable != null) { 
      Bitmap bitmap = ((BitmapDrawable) drawable).getBitmap(); 
      ByteArrayOutputStream stream = new ByteArrayOutputStream(); 
      bitmap.compress(Bitmap.CompressFormat.PNG, 0, stream); 
      final byte[] bitmapdata = stream.toByteArray(); 

      OkHttpClient client = new OkHttpClient(); 
      RequestBody requestBody = new MultipartBuilder() 
        .type(MultipartBuilder.FORM) 
        .addPart(
          Headers.of("Content-Disposition", "form-data; name=\"title\""), 
          RequestBody.create(null, "Sample Text Content")) 
        .addPart(
          Headers.of("Content-Disposition", "form-data; name=\"file\"; filename=\"ic_launcher.png\""), 
          RequestBody.create(MEDIA_TYPE_PNG, bitmapdata)) 
        .build(); 
      final Request request = new Request.Builder() 
        .url("http://192.168.1.100:20583/fileupload") 
        .post(requestBody) 
        .build(); 

      client.newCall(request).enqueue(new Callback() { 
       @Override 
       public void onFailure(final Request request, final IOException e) { 
        Log.e(LOG_TAG, e.toString()); 
        mHandler.post(new Runnable() { 
         @Override 
         public void run() { 
          Toast.makeText(mContext, e.toString(), Toast.LENGTH_SHORT).show(); 
          mTextView.setText(e.toString()); 
         } 
        }); 
       } 

       @Override 
       public void onResponse(Response response) throws IOException { 
        final String message = response.toString(); 
        Log.i(LOG_TAG, message); 
        mHandler.post(new Runnable() { 
         @Override 
         public void run() { 
          Toast.makeText(mContext, message, Toast.LENGTH_SHORT).show(); 
          mTextView.setText(message); 
         } 
        }); 
       } 
      }); 
     } 

Надеется, что это помогает!

+1

Я бы добавил как вариант https://github.com/apptik/jus, если вам нравится залп и вы хотите использовать простоту модификации :) – djodjo

1

public class MultiPartRequester { 
 

 
private Map<String, String> map; 
 
private AsyncTaskCompleteListener mAsynclistener; 
 
private int serviceCode; 
 

 
private HttpClient httpclient; 
 
private Activity activity; 
 
private AsyncHttpRequest request; 
 

 
public MultiPartRequester(Activity activity, Map<String, String> map, 
 
\t \t int serviceCode, AsyncTaskCompleteListener asyncTaskCompleteListener) { 
 
\t this.map = map; 
 
\t this.serviceCode = serviceCode; 
 
\t this.activity = activity; 
 

 
\t // is Internet Connection Available... 
 

 
\t if (AndyUtils.isNetworkAvailable(activity)) { 
 
\t \t mAsynclistener = (AsyncTaskCompleteListener) asyncTaskCompleteListener; 
 
\t \t request = (AsyncHttpRequest) new AsyncHttpRequest().execute(map 
 
\t \t \t \t .get("url")); 
 
\t } else { 
 
\t \t showToast("Network is not available!!!"); 
 
\t } 
 

 
} 
 
class AsyncHttpRequest extends AsyncTask<String, Void, String> { 
 

 
\t @Override 
 
\t protected String doInBackground(String... urls) { 
 
\t \t map.remove("url"); 
 
\t \t try { 
 

 
\t \t \t HttpPost httppost = new HttpPost(urls[0]); 
 
\t \t \t httpclient = new DefaultHttpClient(); 
 
\t \t \t HttpConnectionParams.setConnectionTimeout(httpclient.getParams(), 80000); 
 

 
\t \t \t MultipartEntityBuilder builder = MultipartEntityBuilder 
 
\t \t \t \t \t .create(); 
 

 
\t \t \t for (String key : map.keySet()) { 
 
\t \t \t \t AppLog.Log(key, map.get(key)); 
 
\t \t \t \t builder.addTextBody(key, map.get(key), ContentType 
 
\t \t \t \t \t \t .create("text/plain", MIME.UTF8_CHARSET)); 
 

 
\t \t \t } 
 
\t \t \t httppost.setEntity(builder.build()); 
 

 
\t \t \t ActivityManager manager = (ActivityManager) activity 
 
\t \t \t \t \t .getSystemService(Context.ACTIVITY_SERVICE); 
 

 
\t \t \t if (manager.getMemoryClass() < 25) { 
 
\t \t \t \t System.gc(); 
 
\t \t \t } 
 
\t \t \t HttpResponse response = httpclient.execute(httppost); 
 

 
\t \t \t String responseBody = EntityUtils.toString(
 
\t \t \t \t \t response.getEntity(), "UTF-8"); 
 

 
\t \t \t return responseBody; 
 

 
\t \t } catch (Exception e) { 
 
\t \t \t e.printStackTrace(); 
 
\t \t } catch (OutOfMemoryError oume) { 
 
\t \t \t System.gc(); 
 

 
\t \t \t Toast.makeText(
 
\t \t \t \t \t activity.getParent().getParent(), 
 
\t \t \t \t \t "Run out of memory please colse the other background apps and try again!", 
 
\t \t \t \t \t Toast.LENGTH_LONG).show(); 
 
\t \t } finally { 
 
\t \t \t if (httpclient != null) 
 
\t \t \t \t httpclient.getConnectionManager().shutdown(); 
 

 
\t \t } 
 

 
\t \t return null; 
 

 
\t } 
 

 
\t @Override 
 
\t protected void onPostExecute(String response) { 
 

 
\t \t if (mAsynclistener != null) { 
 
\t \t \t mAsynclistener.onTaskCompleted(response, serviceCode); 
 
\t \t } 
 

 
\t } 
 
} 
 
private void showToast(String msg) { 
 
\t Toast.makeText(activity, msg, Toast.LENGTH_SHORT).show(); 
 
} 
 

 
public void cancelTask() { 
 
\t request.cancel(true); 
 
\t // System.out.println("task is canelled"); 
 

 
} 
 
}

Смежные вопросы