博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
android volley 上传图片 和参数,android - 使用android中的volley将图像上传到multipart中的服务器 - 堆栈内存溢出...
阅读量:1536 次
发布时间:2019-04-21

本文共 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()是做什么的?

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

转载地址:http://ykidy.baihongyu.com/

你可能感兴趣的文章
PTA 循环和数组(Java)
查看>>
PTA 数组和字符串(Java)
查看>>
PTA 面向对象(Java)
查看>>
netty4 io.netty.util.IllegalReferenceCountException: refCnt: 0异常
查看>>
IntelliJ IDEA 插件 阿里巴巴Java开发手册(Alibaba Java Coding Guidelines)
查看>>
认识Java
查看>>
java中非静态、静态方法的调用、方法中调用方法
查看>>
Java中的访问权限修饰符、各种变量、static、final等关键字,一直混淆的整理(未完)
查看>>
宋红康的快捷键包描述(idea导入类似eclipse的)keymap-shkstart.jar
查看>>
IDEA默认的快捷键整理!!
查看>>
超宽带雷达P440?雷达的快时间慢时间是什么意思?
查看>>
教育授权certificate used to sign the license
查看>>
从内存解释:方法传参(基本数据类型、引用数据类型(对象、数组、String类型)),原值是否改变?
查看>>
java中数组为空和数组长度为0的区别
查看>>
SecureCRT连接不上虚拟机
查看>>
为什么在创建线程时,更推荐用实现Runnable接口的方法?而不是继承Thread类的方法?
查看>>
从100万个数中找出最大的前100个数-最小堆、分块
查看>>
并发下的ArrayList、HashMap
查看>>
仿牛客社区项目2.2登录模块——开发注册功能
查看>>
仿牛客社区项目2.3登录模块——会话管理Cookie、Session
查看>>