2016-04-09 1 views
4

J'utilise la classe MultiPartRequester pour le téléchargement d'images multi-parties sur le serveur, mais j'ai trouvé que certaines parties sont obsolètes. Par exemple, HttpConnectionParams, getConnectionManager() etc., donc tout le monde a une nouvelle solution qui n'est pas obsolète avec le nouveau niveau d'API pour le téléchargement de fichiers?Téléchargement d'image multipart Android avec HttpConnectionParams obsolète dans la nouvelle API

J'utilise ce code.

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

Je cherche aussi .... même – nidhi

+0

Pour getConnectionManager() essayez ce lien: http://stackoverflow.com/questions/20713321/httpclient-getconnectionmanager-is-deprecated -what-devrait-être-utilisé-à la place – Mrunal

+1

Je pense que cette réponse peut vous aider: http://stackoverflow.com/questions/32240177/working-post-multipart-request-with-volley-and-without-httpentity –

Répondre

6

cette classe est 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; 
    } 

} 

cette classe est 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(); 
    } 
} 

et c'est la classe 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; 
     } 
    } 
} 
morue

échantillon:

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); 
    } 
} 

Vous pouvez ajouter plus de demande à ma demande et l'appeler n'importe où. comme ceci:

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) 
         { 

         } 
        }); 

morue côté serveur (.net):

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; 
     } 
    } 

public class 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 ""; 
    } 
} 

et changer votre RouteConfige comme ceci:

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 } 
      ); 
     } 
    } 

exemple de code pour le côté serveur:

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

si vous avez besoin d'échantillons de morue pour les utiliser juste faites le moi savoir –

+1

oui, s'il vous plaît envoyez l'exemple de code comment l'utiliser. – nidhi

+0

lol.i a édité ma réponse 30mins plus tard.can vous voyez cela? –

2

Ouais comme Apache HTTPClient est dépréciée, vous pouvez maintenant utiliser HttpURLConnection J'ai utilisé ce code pour envoyer plusieurs fichiers sur gmail via SMTP, vous modifiez le code et l'utiliser!

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

OMI, vous devriez utiliser l'un des f uite:

  1. OkHttp

  2. Retrofit

  3. Google's Volley

Avec Volley et l'amélioration YON peut lire mes réponses en Working POST Multipart Request with Volley and without HttpEntity et Retrofit - Multipart request: Required MultipartFile parameter 'file' is not present

Regaring OkHttp, s'il vous plaît essayer My GitHub sample project avec le code de l'échantillon de base comme suit:

// 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); 
         } 
        }); 
       } 
      }); 
     } 

Hope it helps!

+1

J'ajouterais comme option https://github.com/apptik/jus si vous aimez la volée et que vous voulez utiliser la simplicité de la rénovation :) – 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"); 
 

 
} 
 
}