在Android中发布包含图片的分段请求? [英] Posting a multipart request with image in Android?

查看:94
本文介绍了在Android中发布包含图片的分段请求?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我试图将对象的JSON表示形式和可选图像发布到我的Spring后端.但是,我在发布带有图像的请求时遇到了很大的麻烦.我已经设法将第一部分发布到服务器上了; JSON对象.但是,当我尝试添加第二部分(即用户捕获的图像)时,没有任何反应.我没有看到任何堆栈跟踪.

I am trying to post a JSON representation of my object and an optional image to my Spring backend. However, I am having major trouble posting a request with an image. I have managed to post the first part to the server; the JSON object. However when I try to add a second part which is an image captured by the user nothing happens. I don't see any stacktraces.

我做错了什么以及如何在请求中发布图像.这就是我所拥有的...

What am I doing wrong and how do I post an image along the request. This is what I have...

String boundary = UUID.randomUUID().toString();
String twoHyphens = "--";
String attachmentName = "data";
String crlf = "\r\n";


try {
    URI uri = new URI("http://myappserver.com/app");
    HttpURLConnection urlConnection = (HttpURLConnection) uri.toURL().openConnection();
    urlConnection.setRequestMethod("POST");
    urlConnection.setRequestProperty("Connection", "Keep-Alive");
    urlConnection.setDoInput(true);
    urlConnection.setDoOutput(true);
    urlConnection.setRequestProperty("Content-Type", "multipart/form-data;boundary=" + boundary);

    DataOutputStream dos = new DataOutputStream(urlConnection.getOutputStream());

    InputStream inputStream = context.getContentResolver().openInputStream(question.getUri());

    // FIRST PART; A JSON object
    dos.writeBytes(twoHyphens + boundary);
    dos.writeBytes(crlf);
    dos.writeBytes("Content-Type: application/json");
    dos.writeBytes(crlf);
    dos.writeBytes("Content-Disposition: form-data; name=\"data\"");
    dos.writeBytes(crlf);
    dos.writeBytes(crlf);
    dos.writeBytes(jsonEntity);
    dos.writeBytes(crlf);

    // SECOND PART; A image..
    dos.writeBytes(twoHyphens + boundary);
    dos.writeBytes(crlf);
    dos.writeBytes("Content-Type: image/jpg");
    dos.writeBytes(crlf);
    dos.writeBytes("Content-Disposition: form-data; name=\"image\"");
    dos.writeBytes(crlf);
    dos.writeBytes(crlf);

    // Something must be done here. I guess I must encode it to Base64 here.
    // How can I avoid loading the whole image at once so I don't get out of memory errors.

    dos.writeBytes(crlf);
    dos.writeBytes(twoHyphens + boundary + twoHyphens + crlf);
    dos.close();
} catch (Exception e) {

}

推荐答案

代码说明了如何发送文件(此处为pdf).完成它,对您调试代码将很有帮助.

The code illustrates how to send a file (here it is pdf). Go through it, it will be helpful for you to debug your code.

int bytesRead, bytesAvailable, bufferSize;
byte[] buffer;
int maxBufferSize = 1 * 1024 * 1024;
FileInputStream fileInputStream = new FileInputStream(file);

dos.writeBytes(twoHyphens + boundary + lineEnd); 
dos.writeBytes("Content-Disposition: form-data; name=\"attachment_0\";filename=\"" + file.getName() + "\"" + lineEnd);
dos.writeBytes("Content-Type: text/pdf" + lineEnd);
dos.writeBytes("Content-Length: " + file.length() + lineEnd);    
dos.writeBytes(lineEnd);        
bytesAvailable = fileInputStream.available(); 
bufferSize = Math.min(bytesAvailable, maxBufferSize);
buffer = new byte[bufferSize];
bytesRead = fileInputStream.read(buffer, 0, bufferSize);  

while (bytesRead > 0) 
{             
    dos.write(buffer, 0, bufferSize);
    bytesAvailable = fileInputStream.available();
    bufferSize = Math.min(bytesAvailable, maxBufferSize);
    bytesRead = fileInputStream.read(buffer, 0, bufferSize); 
}   

dos.writeBytes(lineEnd);
dos.writeBytes(twoHyphens + boundary + lineEnd);
fileInputStream.close();
}

//用于发送参数,请参见下文,key是webservice参数的密钥.

//for sending a parameter, see below, key is the key of the webservice parameter.

dos.writeBytes("Content-Disposition: form-data; name=\""+key+"\"" + lineEnd);
dos.writeBytes(lineEnd);
dos.writeBytes(requestData.get(key).toString() + lineEnd);

这篇关于在Android中发布包含图片的分段请求?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆