【问题标题】:how to upload file into server in android?如何将文件上传到android中的服务器?
【发布时间】:2016-09-29 09:31:26
【问题描述】:

如何使用 volley 库将文件(数据)从移动设备发送到服务器。

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

        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 个文件并将其发送到服务器如果有人可以请给我建议。

如果有人有使用 volley 发送带有参数的多个文件的示例,请指导我。提前致谢。

【问题讨论】:

  • 感谢您回复@Nitesh,mplas。我怀疑如何将文件内容参数作为数组发送以发送多个文件。像filecontent0,filecontent1/ 这里filecontent是添加文件的文件参数。
  • 您必须单独上传所有文件,然后在实际帖子中附加它们的 ID .. 我认为没有办法将所有文件一起上传。

标签: java android android-volley filereader fileinputstream


【解决方案1】:

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

要使用 volly 上传多个文件,请按照以下步骤操作:

第 1 步: 创建一个名为 MultipartRequest.java 的新类,它从 volly 扩展 Request,如下所示:

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 或者您可以使用改造库,两者各有优缺点

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-10
    相关资源
    最近更新 更多