「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > AndroidのVolleyでMultiPartの作業を行う方法は?

AndroidのVolleyでMultiPartの作業を行う方法は?

2025-02-06に投稿しました
ブラウズ:505

How to Make Working POST Multipart Requests with Volley in Android?

最新のAPI

を使用してボレーでのマルチパート要求を使用して、ファイルやテキストデータのアップロードなどのマルチパートリクエストを送信します。一般的なタスク。 Httpentityは新しいAPIバージョンでは利用できなくなりましたが、Volleyを使用してマルチパート要求を達成する方法はまだあります。

、次のようなVolleyのリクエストクラスを拡張できます。 com.android.volley.networkResponseをインポートします。 com.android.volley.parseerrorをインポートします。 com.android.volley.requestをインポートします。 com.android.volley.responseをインポートします。 com.android.volley.volleyerrorをインポートします。 com.android.volley.toolbox.httpheaderparserをインポートします。 java.util.mapをインポートします。 クラスMultiPartRequest拡張リクエスト { //リクエスト応答のリスナー プライベート最終Response.listener mlistener; //リクエストエラーのリスナー プライベート最終Response.ErrorListener MerrorListener; //ヘッダーを要求します プライベート最終マップ mheaders; //マルチパートMIMEタイプ(例: "Multipart/form-data; boundary = xxx"))) プライベートファイナルストリングmmimeType; //マルチパートとしてボディを要求します プライベートファイナルバイト[] mmultipartbody; //コンストラクター public MultiPartRequest(string url、map headers、string mimetype、byte [] multipartbody、 Response.Listener リスナー、Response.ErrorListener errorListener){ super(method.post、url、errorlistener); this.mlistener =リスナー; this.merrorlistener = errorListener; this.mheaders = headers; this.mmimetype = mimetype; this.mmultipartbody = multipartbody; } //ゲッターとセッター //カスタムヘッダーを追加する必要がある場合はgetheaders()オーバーライド @オーバーライド パブリックマップ getheaders()throws authfailureerror { return(mheaders!= null)? mheaders:super.getheaders(); } // Override getBodyContentType()にマルチパートリクエストに正しいMIMEタイプを設定する @オーバーライド public string getBodyContentType(){ mmimetypeを返します。 } // getBody()をオーバーライドして、マルチパートボディを返します @オーバーライド public byte [] getBody()throws authfailureerror { mmultipartbodyを返します。 } // parsenetworkResponse()をオーバーライドして、networksponseとして応答を解析する @オーバーライド 保護された応答 parsenetWorkResponse(networkResponse応答){ 試す { RESPONSE.SUCCESS( 応答、 httpheaderparser.parsecacheheaders(response)); } catch(例外e){ Return Response.Error(New Parseerror(e)); } } //応答とエラーの配信 @オーバーライド 保護されたvoid deliverResponse(networkResponse応答){ mlistener.onResponse(応答); } @オーバーライド public void dervererror(bolleyerrorエラー){ merrorlistener.onerrorresponse(エラー); } }

マルチパートボディ

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.VolleyError;
import com.android.volley.toolbox.HttpHeaderParser;

import java.util.Map;

class MultipartRequest extends Request {
    // Listener for request response
    private final Response.Listener mListener;
    // Listener for request error
    private final Response.ErrorListener mErrorListener;
    // Request headers
    private final Map mHeaders;
    // Multipart mime type (e.g., "multipart/form-data; boundary=XXX")
    private final String mMimeType;
    // Request body as multipart
    private final byte[] mMultipartBody;

    // Constructor
    public MultipartRequest(String url, Map headers, String mimeType, byte[] multipartBody,
                            Response.Listener listener, Response.ErrorListener errorListener) {
        super(Method.POST, url, errorListener);
        this.mListener = listener;
        this.mErrorListener = errorListener;
        this.mHeaders = headers;
        this.mMimeType = mimeType;
        this.mMultipartBody = multipartBody;
    }

    // Getters and setters

    // Override getHeaders() if you need to add custom headers
    @Override
    public Map getHeaders() throws AuthFailureError {
        return (mHeaders != null) ? mHeaders : super.getHeaders();
    }

    // Override getBodyContentType() to set the correct mime type for the multipart request
    @Override
    public String getBodyContentType() {
        return mMimeType;
    }

    // Override getBody() to return the multipart body
    @Override
    public byte[] getBody() throws AuthFailureError {
        return mMultipartBody;
    }

    // Override parseNetworkResponse() to parse the response as a NetworkResponse
    @Override
    protected Response parseNetworkResponse(NetworkResponse response) {
        try {
            return Response.success(
                    response,
                    HttpHeaderParser.parseCacheHeaders(response));
        } catch (Exception e) {
            return Response.error(new ParseError(e));
        }
    }

    // Delivering response and error
    @Override
    protected void deliverResponse(NetworkResponse response) {
        mListener.onResponse(response);
    }

    @Override
    public void deliverError(VolleyError error) {
        mErrorListener.onErrorResponse(error);
    }
}
を構築するマルチパートボディを構築するには、次の手順を使用できます。 0]; bytearrayoutputStream bos = new bytearrayoutputStream(); dataoutputStream dos = new DataOutputStream(BOS); 試す { //テキストデータ BuildTextPart(dos、 "name"、 "John Doe"); BuildTextPart(dos、 "email"、 "[email protected]"); //画像データ bitmap imagebitmap = bitmapfactory.decoderesource(context.getResources()、r.drawable.my_image); buildimagepart(dos、 "image"、imagebitmap); } catch(ioException e){ e.printstacktrace(); } MultiPartBody = bos.tobytearray();

リクエストのマルチパート本体を含む

マルチパート本体が構築されたら、マルチパートトレートのインスタンスに含めることができます。 :
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.VolleyError;
import com.android.volley.toolbox.HttpHeaderParser;

import java.util.Map;

class MultipartRequest extends Request {
    // Listener for request response
    private final Response.Listener mListener;
    // Listener for request error
    private final Response.ErrorListener mErrorListener;
    // Request headers
    private final Map mHeaders;
    // Multipart mime type (e.g., "multipart/form-data; boundary=XXX")
    private final String mMimeType;
    // Request body as multipart
    private final byte[] mMultipartBody;

    // Constructor
    public MultipartRequest(String url, Map headers, String mimeType, byte[] multipartBody,
                            Response.Listener listener, Response.ErrorListener errorListener) {
        super(Method.POST, url, errorListener);
        this.mListener = listener;
        this.mErrorListener = errorListener;
        this.mHeaders = headers;
        this.mMimeType = mimeType;
        this.mMultipartBody = multipartBody;
    }

    // Getters and setters

    // Override getHeaders() if you need to add custom headers
    @Override
    public Map getHeaders() throws AuthFailureError {
        return (mHeaders != null) ? mHeaders : super.getHeaders();
    }

    // Override getBodyContentType() to set the correct mime type for the multipart request
    @Override
    public String getBodyContentType() {
        return mMimeType;
    }

    // Override getBody() to return the multipart body
    @Override
    public byte[] getBody() throws AuthFailureError {
        return mMultipartBody;
    }

    // Override parseNetworkResponse() to parse the response as a NetworkResponse
    @Override
    protected Response parseNetworkResponse(NetworkResponse response) {
        try {
            return Response.success(
                    response,
                    HttpHeaderParser.parseCacheHeaders(response));
        } catch (Exception e) {
            return Response.error(new ParseError(e));
        }
    }

    // Delivering response and error
    @Override
    protected void deliverResponse(NetworkResponse response) {
        mListener.onResponse(response);
    }

    @Override
    public void deliverError(VolleyError error) {
        mErrorListener.onErrorResponse(error);
    }
}
multipartrequest request = new MultiPartRequest( 「my_url」、 null、//ヘッダー 「MultiPart/Form-Data」、 MultiPartBody、 new Response.listener (){ @オーバーライド public void onResponse(networkResponse応答){ //応答を処理します } }、 new Response.ErrorListener(){ @オーバーライド public void onerrorresponse(bolleyerrorエラー){ //エラーを処理します } }) void buildTextPart(dataoutputStream dataoutputStream、string name、string value)throws ioexception { dataoutputStream.writeBytes(2hyphens境界ラインエンド); dataoutputStream.writeBytes( "content-disposition:form-data; name = \" "name" \ "" lineend); dataoutputStream.writeBytes(lineend); dataoutputStream.writeBytes(value); dataoutputStream.writeBytes(lineend); }

2つのHyphen、境界、およびLineEndをコードから適切な値に置き換えます。 BolleyMultipartRequestクラスの実装:

Import com.android.volley.authfailureerror; com.android.volley.networkResponseをインポートします。 com.android.volley.parseerrorをインポートします。 com.android.volley.requestをインポートします。 com.android.volley.responseをインポートします。 com.android.volley.volleyerrorをインポートします。 com.android.volley.toolbox.httpheaderparserをインポートします。 java.io.bytearrayoutputStreamをインポートします。 java.io.dataoutputStreamをインポートします。 java.io.ioexceptionをインポートします。 java.util.hashmapをインポートします。 java.util.mapをインポートします。 Public Class BolleyMultiPartRequest拡張リクエスト { プライベート最終Response.listener mlistener; プライベート最終Response.ErrorListener MerrorListener; プライベート最終マップ mheaders; プライベートファイナルストリングmmimeType; プライベートファイナルバイト[] mmultipartbody; public bolleymultipartRequest(int method、string url、response.listener リスナー、 Response.ErrorListener errorListener){ super(method、url、errorlistener); this.mlistener =リスナー; this.merrorlistener = errorListener; this.mheaders = null; this.mmimeType = null; this.mmultipartbody = null; } public bolleymultipartrequest(string url、map headers、string mimetype、byte [] multipartbody、 Response.Listener リスナー、Response.ErrorListener errorListener){ super(method.post、url、errorlistener); this.mlistener =リスナー; this.merrorlistener = errorListener; this.mheaders = headers; this.mmimetype = mimetype; this.mmultipartbody = multipartbody; } @オーバーライド パブリックマップ getheaders()throws authfailureerror { return(mheaders!= null)? mheaders:super.getheaders(); } @オーバーライド public string getBodyContentType(){ mmimetypeを返します。 } @オーバーライド public byte [] getBody()throws authfailureerror { mmultipartbodyを返します。 } @オーバーライド 保護された応答 parsenetWorkResponse(networkResponse応答){ 試す { RESPONSE.SUCCESS( 応答、 httpheaderparser.parsecacheheaders(response)); } catch(例外e){ Return Response.Error(New Parseerror(e)); } } @オーバーライド 保護されたvoid deliverResponse(networkResponse応答){ mlistener.onResponse(応答); } @オーバーライド public void dervererror(bolleyerrorエラー){ merrorlistener.onerrorresponse(エラー); } public static map createmultipartrequestparts(map params、map data){ map multipartparams = new Hashmap (); for(map.entry entry:params.entryset()){ MultiPartParams.put(entry.getKey()、new DataPart(entry.getValue())); } for(map.entry entry:data.entryset()){ MultiPartParams.put(entry.getKey()、entry.getValue()); } MultiPartParamsを返します。 } public static byte [] createmultipartbody(map data、string boundary)throws ioexception { bytearrayoutputStream bos = new bytearrayoutputStream(); dataoutputStream dos = new DataOutputStream(BOS); for(map.entry entry:data.entryset()){ BuildTextPart(dos、entry.getKey()、entry.getValue()。getContentType()、entry.getValue()。getFileName()、entry.getValue()。getData()); }

最新のチュートリアル もっと>

免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。

Copyright© 2022 湘ICP备2022001581号-3