2016-09-29 4 views
1

발리 라이브러리를 사용하여 모바일 장치에서 서버로 파일 (데이터)을 보내려면 어떻게해야합니까?안드로이드에 서버에 파일을 업로드하는 방법?

여기 아래에있는 내 매개 변수를 나열하면이 문제를 해결하는 데 도움이됩니다. 위의 파일 PARAM에서

 Map<String, String> mHeaderPart= new HashMap<>(); 
      mHeaderPart.put("Content-type", "multipart/form-data;"); 
      mHeaderPart.put("Authorization", authorizationKey); 


    //String part 
      Map<String, String> mStringPart= new HashMap<>(); 
      mStringPart.put("candidate_id", SessionStores.getBullHornId(getActivity())); 
      mStringPart.put("externalID", "portpolio"); 
      mStringPart.put("fileCount", "2");//number of files 
      mStringPart.put("fileType", "SAMPLE"); 
      mStringPart.put("platform", "android"); 

//file param 

    Map<String, File> mFilePartData= new HashMap<>(); 

내가 파일의 n 개의 번호를 추가해야하고 서버로 전송. 어떻게 장치에서 파일을 가져 와서 param과 함께 n 개의 파일을 추가하고 누군가가 제게 제안을 해줄 수 있다면 서버로 보냈습니다.

누군가가 발리를 사용하여 param을 사용하여 여러 파일을 보내는 사례가 있다면 안내해주세요. 미리 감사드립니다.

+0

[Volley 라이브러리로 이미지 업로드하는 방법?] (http://stackoverflow.com/questions/27112694/how-to-do-upload-image -with-volley-library) – Nitesh

+0

예를 들어 체크 아웃 [Stackoverflow Link] (http : // stackoverfl ow.com/questions/16797468/how-to-send-a-multipart-form-data-post-in-android-with-volley) [Stackoverflow Link] (http://stackoverflow.com/questions/32262829/how) -To-upload-file-using-volley-library-in-android) – mpals

+0

답장을 보내 주셔서 감사합니다. @ Nitesh, mplas. 여러 파일을 보내려는 배열로 filecontent param을 보내는 방법에 대해서는 의문의 여지가 있습니다. filecontent0과 같이, filecontent1/여기서 filecontent는 파일을 추가하기위한 파일 매개 변수입니다. – karthik

답변

0

Volly는 다중 부분을 사용하여 서버에 파일을 업로드하는 직접적인 방법을 제공하지 않습니다. 이하의 절차 volly 사용하여 여러 파일 업로드를 들어

:

단계 1 : volly 아래 등으로부터 요청을 확장 MultipartRequest.java라는 새 클래스 만들기 :

import com.android.volley.AuthFailureError; 

import com.android.volley.NetworkResponse; 

import com.android.volley.ParseError; 

import com.android.volley.Request; 

import com.android.volley.Response; 

import com.android.volley.VolleyLog; 

import com.android.volley.toolbox.HttpHeaderParser; 

import org.apache.http.HttpEntity; 

import org.apache.http.entity.mime.MultipartEntityBuilder; 

import org.apache.http.entity.mime.content.FileBody; 

import java.io.ByteArrayOutputStream; 

import java.io.File; 

import java.io.IOException; 

import java.io.UnsupportedEncodingException; 

import java.util.HashMap; 

import java.util.Map; 

public class MultipartRequest extends Request<String> { private MultipartEntityBuilder entitybuilder = MultipartEntityBuilder.create(); HttpEntity entity; 

    private HashMap<String, File> sendFile = new HashMap<>(); 

    /** 
    * 
    * @param url    url 
    * @param errorListener  volly error listenere 
    * @param sendFile   HashMap with key as file name and value as file object 
    */ 

    public MultipartRequest(String url, Response.ErrorListener errorListener, HashMap<String, File> sendFile) { 
    super(Method.POST, url, errorListener); 

    this.sendFile = sendFile; 
    buildMultipartEntity(); 
    entity = entitybuilder.build(); 
    } 

    private void buildMultipartEntity() { 

    if (sendFile != null) 
     for (Map.Entry<String, File> entry : sendFile.entrySet()) { 
      entitybuilder.addPart(entry.getKey(), new FileBody(entry.getValue())); 

      // here you can set key as filename 
      // value will be the file object to be upload 

     } 
    } 

    @Override 
    public String getBodyContentType() { 
    return entity.getContentType().getValue(); 
    } 

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

    @Override 
    protected Response<String> parseNetworkResponse(NetworkResponse networkResponse) { 
    try { 
     String json = new String(
       networkResponse.data, HttpHeaderParser.parseCharset(networkResponse.headers)); 
     return Response.success(json, HttpHeaderParser.parseCacheHeaders(networkResponse)); 

    } catch (UnsupportedEncodingException e) { 
     return Response.error(new ParseError(e)); 
    } 
    } 

    @Override 
    protected void deliverResponse(String s) { 

    //Your response 

    } 
} 

2 단계 : 활동에서

:

public void executeMultipart(String url,HashMap<String, File> fileData) { 
    try { MultipartRequest mRequest = new MultipartRequest(url , new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError volleyError) { 

      } 
     },fileData); 
     mRequest.setRetryPolicy(new DefaultRetryPolicy(
       (int) TimeUnit.SECONDS.toMillis(20), 
       DefaultRetryPolicy.DEFAULT_MAX_RETRIES, 
       DefaultRetryPolicy.DEFAULT_BACKOFF_MULT)); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
    } 

3 단계 : 앱이 build.gradle 파일 추가에서 :

compile('org.apache.httpcomponents:httpmime:4.3.6') { exclude module: 'httpclient' } 

참고 : API 22 org.apache.http.HttpEntity이되지 않습니다에서, 그래서 더 나은 URLConnection의 또는 수 중 하나를 사용하는 사용 retrofit 라이브러리는 모두 자신의 장점과 단점을 가지고 있습니다