android volley 上传图片 和参数,android - 使用android中的volley将图像上传到multipart中的服务器 - 堆栈内存溢出...
发布日期:2021-06-24 13:11:11 浏览次数:4 分类:技术文章

本文共 9752 字,大约阅读时间需要 32 分钟。

如何在Android中使用volley上传多个部分中的图像,如果网络暂停/失败,如何从已停止的点重新开始上传?

我尝试过使用multipart上传图像的代码。 它没有经过测试,所以我不知道它是否正常工作。 我不知道第二部分是否可以完成。 如果是,那怎么样?

MultipartRequest.java -

public class MultipartRequest extends Request {

private final String twoHyphens = "--";

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

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

private Response.Listener mListener;

private Response.ErrorListener mErrorListener;

private Map mHeaders;

/**

* Default constructor with predefined header and post method.

*

* @param url request destination

* @param headers predefined custom header

* @param listener on success achieved 200 code from request

* @param errorListener on error http or library timeout

*/

public MultipartRequest(String url, Map headers,

Response.Listener listener,

Response.ErrorListener errorListener) {

super(Method.POST, url, errorListener);

this.mListener = listener;

this.mErrorListener = errorListener;

this.mHeaders = headers;

}

/**

* Constructor with option method and default header configuration.

*

* @param method method for now accept POST and GET only

* @param url request destination

* @param listener on success event handler

* @param errorListener on error event handler

*/

public MultipartRequest(int method, String url,

Response.Listener listener,

Response.ErrorListener errorListener) {

super(method, url, errorListener);

this.mListener = listener;

this.mErrorListener = errorListener;

}

@Override

public Map getHeaders() throws AuthFailureError {

return (mHeaders != null) ? mHeaders : super.getHeaders();

}

@Override

public String getBodyContentType() {

return "multipart/form-data;boundary=" + boundary;

}

@Override

public byte[] getBody() throws AuthFailureError {

ByteArrayOutputStream bos = new ByteArrayOutputStream();

DataOutputStream dos = new DataOutputStream(bos);

try {

// populate text payload

Map params = getParams();

if (params != null && params.size() > 0) {

textParse(dos, params, getParamsEncoding());

}

// populate data byte payload

Map data = getByteData();

if (data != null && data.size() > 0) {

dataParse(dos, data);

}

// close multipart form data after text and file data

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

return bos.toByteArray();

} catch (IOException e) {

e.printStackTrace();

}

return null;

}

/**

* Custom method handle data payload.

*

* @return Map data part label with data byte

* @throws AuthFailureError

*/

protected Map getByteData() throws AuthFailureError {

return null;

}

@Override

protected Response 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);

}

/**

* Parse string map into data output stream by key and value.

*

* @param dataOutputStream data output stream handle string parsing

* @param params string inputs collection

* @param encoding encode the inputs, default UTF-8

* @throws IOException

*/

private void textParse(DataOutputStream dataOutputStream, Map params, String encoding) throws IOException {

try {

for (Map.Entry entry : params.entrySet()) {

buildTextPart(dataOutputStream, entry.getKey(), entry.getValue());

}

} catch (UnsupportedEncodingException uee) {

throw new RuntimeException("Encoding not supported: " + encoding, uee);

}

}

/**

* Parse data into data output stream.

*

* @param dataOutputStream data output stream handle file attachment

* @param data loop through data

* @throws IOException

*/

private void dataParse(DataOutputStream dataOutputStream, Map data) throws IOException {

for (Map.Entry entry : data.entrySet()) {

buildDataPart(dataOutputStream, entry.getValue(), entry.getKey());

}

}

/**

* Write string data into header and data output stream.

*

* @param dataOutputStream data output stream handle string parsing

* @param parameterName name of input

* @param parameterValue value of input

* @throws IOException

*/

private void buildTextPart(DataOutputStream dataOutputStream, String parameterName, String parameterValue) throws IOException {

dataOutputStream.writeBytes(twoHyphens + boundary + lineEnd);

dataOutputStream.writeBytes("Content-Disposition: form-data; name=\"" + parameterName + "\"" + lineEnd);

//dataOutputStream.writeBytes("Content-Type: text/plain; charset=UTF-8" + lineEnd);

dataOutputStream.writeBytes(lineEnd);

dataOutputStream.writeBytes(parameterValue + lineEnd);

}

/**

* Write data file into header and data output stream.

*

* @param dataOutputStream data output stream handle data parsing

* @param dataFile data byte as DataPart from collection

* @param inputName name of data input

* @throws IOException

*/

private void buildDataPart(DataOutputStream dataOutputStream, DataPart dataFile, String inputName) throws IOException {

dataOutputStream.writeBytes(twoHyphens + boundary + lineEnd);

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

inputName + "\"; filename=\"" + dataFile.getFileName() + "\"" + lineEnd);

if (dataFile.getType() != null && !dataFile.getType().trim().isEmpty()) {

dataOutputStream.writeBytes("Content-Type: " + dataFile.getType() + lineEnd);

}

dataOutputStream.writeBytes(lineEnd);

ByteArrayInputStream fileInputStream = new ByteArrayInputStream(dataFile.getContent());

int bytesAvailable = fileInputStream.available();

int maxBufferSize = 1024 * 1024;

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

byte[] buffer = new byte[bufferSize];

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);

}

/**

* Simple data container use for passing byte file

*/

public class DataPart {

private String fileName;

private byte[] content;

private String type;

/**

* Default data part

*/

public DataPart() {

}

/**

* Constructor with data.

*

* @param name label of data

* @param data byte data

*/

public DataPart(String name, byte[] data) {

fileName = name;

content = data;

}

/**

* Constructor with mime data type.

*

* @param name label of data

* @param data byte data

* @param mimeType mime data like "image/jpeg"

*/

public DataPart(String name, byte[] data, String mimeType) {

fileName = name;

content = data;

type = mimeType;

}

/**

* Getter file name.

*

* @return file name

*/

public String getFileName() {

return fileName;

}

/**

* Setter file name.

*

* @param fileName string file name

*/

public void setFileName(String fileName) {

this.fileName = fileName;

}

/**

* Getter content.

*

* @return byte file data

*/

public byte[] getContent() {

return content;

}

/**

* Setter content.

*

* @param content byte file data

*/

public void setContent(byte[] content) {

this.content = content;

}

/**

* Getter mime type.

*

* @return mime type

*/

public String getType() {

return type;

}

/**

* Setter mime type.

*

* @param type mime type

*/

public void setType(String type) {

this.type = type;

}

}

}

上传图片功能:

public static void uploadMultipartImage(final Bitmap bitmap, final

UploadServiceRestInf restclientinterface, final Context context) {

String url = "";

MultipartRequest multipartRequest = new

MultipartRequest(Request.Method.POST, url, new

Response.Listener() {

@Override

public void onResponse(NetworkResponse response) {

String resultResponse = new String(response.data);

try {

JSONObject result = new JSONObject(resultResponse);

String status = result.getString("status");

String message = result.getString("message");

Log.e("UploadImageService", message);

restclientinterface.uploadStatus(message);

} catch (JSONException e) {

e.printStackTrace();

}

}

}, new Response.ErrorListener() {

@Override

public void onErrorResponse(VolleyError error) {

NetworkResponse networkResponse = error.networkResponse;

String errorMessage = "Unknown error";

if (networkResponse == null) {

if (error.getClass().equals(TimeoutError.class)) {

errorMessage = "Request timeout";

} else if (error.getClass().equals(NoConnectionError.class)) {

errorMessage = "Failed to connect server";

}

} else {

String result = new String(networkResponse.data);

try {

JSONObject response = new JSONObject(result);

String status = response.getString("status");

String message = response.getString("message");

Log.e("UploadImageService", "onErrorResponse : " + message);

restclientinterface.uploadStatus(message);

} catch (JSONException e) {

e.printStackTrace();

}

}

}

}) {

@Override

public Map getHeaders() throws AuthFailureError {

HashMap params = getHeaderParams(context);

return params;

}

@Override

protected Map getParams() {

Map params = new HashMap<>();

return params;

}

@Override

protected Map getByteData() {

Map params = new HashMap<>();

// params.put("avatar", new DataPart("file_avatar.jpg", ImageUploadUtils.getFileDataFromBitmap(context,bitmap), "image/jpeg"));

params.put("cover", new DataPart("file_cover.jpg", ImageUploadUtils.getFileDataFromBitmap(context, bitmap), "image/jpeg"));

return params;

}

};

queue = VolleySingleton.getInstance(context).getRequestQueue();

queue.add(multipartRequest);

}

Util类:

/**

* Turn bitmap into byte array.

*

* @param bitmap

* @return byte array

*/

public static byte[] getFileDataFromBitmap(Context context, Bitmap bitmap) {

ByteArrayOutputStream byteArrayOutputStream = new

ByteArrayOutputStream();

bitmap.compress(Bitmap.CompressFormat.JPEG, 80, byteArrayOutputStream);

return byteArrayOutputStream.toByteArray();

}

我无法理解上述代码是否正确? 文件上传功能中的getByteData()和getParams()是做什么的?

如何从已停止的部分恢复图像上传?

转载地址:https://blog.csdn.net/weixin_33001305/article/details/117499266 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:android开发的取消清空按钮,Android开发实现带清空按钮的EditText示例
下一篇:android音乐播放器音乐加载,Android开源音乐播放器之在线音乐列表自动加载更多...

发表评论

最新留言

逛到本站,mark一下
[***.202.152.39]2024年04月01日 00时10分02秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章