2016-09-29 113 views
1

我如何使用排球库从移动设备发送文件(数据)到服务器。如何在android中将文件上传到服务器?

这里我列出了我的参数,请帮我解决这个问题。

 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个文件并将其发送到服务器。我如何从设备获取文件,并添加n个文件与param并将其发送到服务器,如果有人可以请给我建议。

如果有人有使用抽球发送多个文件与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)(http://stackoverflow.com/questions/32262829/how -to-upload-file-using-volley-library-in-android) – mpals

+0

感谢您的回复@Nitesh,mplas。我怀疑如何发送filecontent参数作为一个数组发送多个文件。像filecontent0,filecontent1 /这里filecontent是文件参数添加文件。 – karthik

回答

0

Volly不提供使用多部分在服务器上上传文件的直接方式。

用于上传使用volly按如下步骤多个文件:

步骤1:创建一个名为MultipartRequest.java新类从volly像下方延伸请求:

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或者你可以使用改造库都有自己的优点和缺点