Heim > Java > javaLernprogramm > Wie führe ich eine POST-Multipart-Anfrage mit Volley ohne HttpEntity durch?

Wie führe ich eine POST-Multipart-Anfrage mit Volley ohne HttpEntity durch?

DDD
Freigeben: 2024-12-04 11:34:11
Original
657 Leute haben es durchsucht

How to Perform a POST Multipart Request with Volley Without HttpEntity?

POST Multipart Request with Volley Without HttpEntity

HttpEntity ist seit API 22 veraltet und seit API 23 vollständig entfernt. Infolgedessen wird auf Folgendes zugegriffen Die HttpEntity-Referenz in Android Developer ist nicht mehr vorhanden möglich.

Lösung

Um eine POST-Multipart-Anfrage mit Volley ohne HttpEntity durchzuführen, können Sie das folgende Code-Snippet verwenden:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

package com.example.multipartvolley;

 

import android.content.Context;

import android.graphics.Bitmap;

import android.graphics.drawable.BitmapDrawable;

import android.graphics.drawable.Drawable;

import android.os.Bundle;

import android.support.v4.content.ContextCompat;

import android.view.Menu;

import android.view.MenuItem;

import android.widget.Toast;

 

import com.android.volley.NetworkResponse;

import com.android.volley.Response;

import com.android.volley.VolleyError;

 

import java.io.ByteArrayInputStream;

import java.io.ByteArrayOutputStream;

import java.io.DataOutputStream;

import java.io.IOException;

 

 

public class MultipartActivity extends Activity {

 

    private final Context context = this;

    private final String twoHyphens = "--";

    private final String lineEnd = "\r\n";

    private final String boundary = "apiclient-" + System.currentTimeMillis();

    private final String mimeType = "multipart/form-data;boundary=" + boundary;

    private byte[] multipartBody;

 

    @Override

    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_multipart);

 

        byte[] fileData1 = getFileDataFromDrawable(context, R.drawable.ic_action_android);

        byte[] fileData2 = getFileDataFromDrawable(context, R.drawable.ic_action_book);

 

        ByteArrayOutputStream bos = new ByteArrayOutputStream();

        DataOutputStream dos = new DataOutputStream(bos);

        try {

            // the first file

            buildPart(dos, fileData1, "ic_action_android.png");

            // the second file

            buildPart(dos, fileData2, "ic_action_book.png");

            // send multipart form data necesssary after file data

            dos.writeBytes(twoHyphens + boundary + twoHyphens + lineEnd);

            // pass to multipart body

            multipartBody = bos.toByteArray();

        } catch (IOException e) {

            e.printStackTrace();

        }

 

        String url = "http://192.168.1.100/api/postfile";

        MultipartRequest multipartRequest = new MultipartRequest(url, null, mimeType, multipartBody, new Response.Listener<NetworkResponse>() {

            @Override

            public void onResponse(NetworkResponse response) {

                Toast.makeText(context, "Upload successfully!", Toast.LENGTH_SHORT).show();

            }

        }, new Response.ErrorListener() {

            @Override

            public void onErrorResponse(VolleyError error) {

                Toast.makeText(context, "Upload failed!\r\n" + error.toString(), Toast.LENGTH_SHORT).show();

            }

        });

 

        VolleySingleton.getInstance(context).addToRequestQueue(multipartRequest);

    }

 

    @Override

    public boolean onCreateOptionsMenu(Menu menu) {

        // Inflate the menu; this adds items to the action bar if it is present.

        getMenuInflater().inflate(R.menu.menu_multipart, menu);

        return true;

    }

 

    @Override

    public boolean onOptionsItemSelected(MenuItem item) {

        // Handle action bar item clicks here. The action bar will

        // automatically handle clicks on the Home/Up button, so long

        // as you specify a parent activity in AndroidManifest.xml.

        int id = item.getItemId();

 

        //noinspection SimplifiableIfStatement

        if (id == R.id.action_settings) {

            return true;

        }

 

        return super.onOptionsItemSelected(item);

    }

 

    private void buildPart(DataOutputStream dataOutputStream, byte[] fileData, String fileName) throws IOException {

        dataOutputStream.writeBytes(twoHyphens + boundary + lineEnd);

        dataOutputStream.writeBytes("Content-Disposition: form-data; name=\"uploaded_file\"; filename=\""

                + fileName + "\"" + lineEnd);

        dataOutputStream.writeBytes(lineEnd);

 

        ByteArrayInputStream fileInputStream = new ByteArrayInputStream(fileData);

        int bytesAvailable = fileInputStream.available();

 

        int maxBufferSize = 1024 * 1024;

        int bufferSize = Math.min(bytesAvailable, maxBufferSize);

        byte[] buffer = new byte[bufferSize];

 

        // read file and write it into form...

        int bytesRead = fileInputStream.read(buffer, 0, bufferSize);

 

        while (bytesRead > 0) {

            dataOutputStream.write(buffer, 0, bufferSize);

            bytesAvailable = fileInputStream.available();

            bufferSize = Math.min(bytesAvailable, maxBufferSize);

            bytesRead = fileInputStream.read(buffer, 0, bufferSize);

        }

 

        dataOutputStream.writeBytes(lineEnd);

    }

 

    private byte[] getFileDataFromDrawable(Context context, int id) {

        Drawable drawable = ContextCompat.getDrawable(context, id);

        Bitmap bitmap = ((BitmapDrawable) drawable).getBitmap();

        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();

        bitmap.compress(Bitmap.CompressFormat.PNG, 0, byteArrayOutputStream);

        return byteArrayOutputStream.toByteArray();

    }

}

Nach dem Login kopieren

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

package com.example.multipartvolley;

 

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;toolbox.HttpHeaderParser;

 

import java.util.Map;

 

class MultipartRequest extends Request<NetworkResponse> {

    private final Response.Listener<NetworkResponse>

mListener;

    private final Response.ErrorListener

mErrorListener;

    private final Map<String, String>

mHeaders;

    private final String

mMimeType;

    private final byte[]

mMultipartBody;

 

    public MultipartRequest(String url, Map<String,

String> headers, String mimeType, byte[]

multipartBody, Response.Listener<NetworkResponse>

listener, Response.ErrorListener

errorListener) {

        super(Method.POST, url,

errorListener);

        this.mListener = listener;

        this.mErrorListener =

errorListener;

        this.mHeaders = headers;

        this.mMimeType = mimeType;

        this.mMultipartBody = multipartBody;

    }

 

    @Override

    public Map<String,

String> getHeaders() throws AuthFailureError {

        return (mHeaders != null)

? mHeaders : super.getHeaders();

    }

 

    @Override

    public String getBodyContentType() {

        return mMimeType;

    }

 

    @Override

    public byte[] getBody() throws AuthFailureError {

        return mMultipartBody;

    }

 

    @Override

    protected Response<NetworkResponse>

parseNetworkResponse(NetworkResponse response) {

        try {

            return Response.success(

                    response,

                    HttpHeaderParser.parseCacheHeaders(response));

        } catch (Exception e) {

            return Response.error(new

ParseError(e));

        }

    }

 

    @Override

    protected void deliverResponse(NetworkResponse response) {

        mListener.onResponse(response);

    }

 

    @Override

    public void deliverError(VolleyError

error) {

        mErrorListener.onErrorResponse(error);

    }

}

Nach dem Login kopieren

Dieser Code kümmert sich um den Aufbau des mehrteiligen Anfragetextes und das Senden der Anfrage an den Server. Sie können es an Ihre spezifischen Anforderungen anpassen, indem Sie beispielsweise zusätzliche Parameter hinzufügen oder die Anforderungsheader anpassen.

Textteil

Wenn Sie Textteile in Ihre Anfrage einfügen müssen Bei einer mehrteiligen Anfrage können Sie dies tun, indem Sie die Methode getParams() in Ihrer MultipartRequest-Klasse überschreiben. Mit dieser Methode können Sie Schlüssel-Wert-Paare zu den Anforderungsparametern hinzufügen. Zum Beispiel:

1

2

3

4

5

6

7

8

9

10

@Override

protected Map<String, String> getParams() {

    Map<String, String> params = new HashMap<>();

    params.put("api_token", "gh659gjhvdyudo973823tt9gvjf7i6ric75r76");

    params.put("name", "Angga");

    params.put("location", "Indonesia");

    params.put("about", "UI/UX Designer");

    params.put("contact", "[email&#160;protected]");

    return params;

}

Nach dem Login kopieren

**Hinweis

Das obige ist der detaillierte Inhalt vonWie führe ich eine POST-Multipart-Anfrage mit Volley ohne HttpEntity durch?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage