从android应用程序java HttpURLConnection发送图像文件和文本多部分表单数据



嗨,我正在尝试上传一个文件和一个文本,使用多部分表单数据HttpURLConnectionjava,下面的代码示例:

String boundary = UUID.randomUUID().toString();
final String LINE_FEED = "rn";
OutputStream outputStream;
PrintWriter writer;
URL url_upload = new URL(url_api );
HttpURLConnection conn = (HttpURLConnection) url_upload.openConnection();
conn.setUseCaches(false);
conn.setDoOutput(true); // indicates POST method
conn.setDoInput(true);
conn.setRequestMethod("POST");

conn.setRequestProperty( "Content-Type", "multipart/form-data;boundary=" + boundary);
conn.setRequestProperty("User-Agent", "Android Multipart HTTP Client 1.0");
conn.setRequestProperty("Connection", "Keep-Alive");

outputStream = conn.getOutputStream();
writer = new PrintWriter(new OutputStreamWriter(outputStream, "UTF-8"), true);
//DataOutputStream request = new DataOutputStream(conn.getOutputStream());
//Username
writer.append("--").append(boundary).append(LINE_FEED);
writer.append("Content-Disposition: form-data; name="" + "Username" + """)
.append(LINE_FEED);
writer.append("Content-Type: text/plain; charset=").append("UTF-8").append(
LINE_FEED);
writer.append(LINE_FEED);
writer.append(Username).append(LINE_FEED);
writer.flush();
//Password
writer.append("--").append(boundary).append(LINE_FEED);
writer.append("Content-Disposition: form-data; name="" + "Password" + """)
.append(LINE_FEED);
writer.append("Content-Type: text/plain; charset=").append("UTF-8").append(
LINE_FEED);
writer.append(LINE_FEED);
writer.append(Password);
writer.flush();
writer.append(LINE_FEED);

if(Food_image_file_name != null)
{
Log.i("File:", String.valueOf(file1));

writer.append("--").append(boundary).append(LINE_FEED);
writer.append("Content-Disposition: form-data; name="" + "file1" + ""; filename="").append(file1.getName()).append(""")
.append(LINE_FEED);
writer.append("Content-Type: ").append(URLConnection.guessContentTypeFromName(file1.getName()))
.append(LINE_FEED);
writer.append("Content-Transfer-Encoding: binary");
writer.append(LINE_FEED);
writer.flush();
writer.append(LINE_FEED);
FileInputStream inputStream = new FileInputStream(String.valueOf(file1.toPath()));
byte[] buffer = new byte[4096];
int bytesRead = -1;
while ((bytesRead = inputStream.read(buffer)) != -1) {
outputStream.write(buffer, 0, bytesRead);
}
outputStream.flush();
inputStream.close();
writer.append(LINE_FEED);
writer.flush();

writer.append(LINE_FEED).flush();
writer.append("--").append(boundary).append("--").append(LINE_FEED);
writer.close();

其他详细信息:I/File::/storage/emulated/0/DCIM/100ANDRO/DS_0117.JPGI/Api响应:400,错误请求

注:我测试了邮差的服务器,它在postman上工作时没有问题,这些文件是从邮差成功上传到服务器的。

这个链接是我用来阅读请求的web api示例的另一篇帖子:link_here

更新:我不得不修改我的web api一点,因为我没有正确使用,代码现在工作得很好

I/File:: /storage/emulated/0/Pictures/Viber/IMG-8bf36fec3b3c01df23c7faf763e2eac7-V.jpg
I/Boundary: ****
I/Image Content type: image/jpeg

在Blob映像Azure中,我看到该映像不可见,它已损坏。

所以我上一期是写图片,下面的代码正确,现在工作起来很有魅力;(

writer.append("--").append(boundary).append(LINE_FEED);
writer.append("Content-Disposition: form-data; name="" + "file1" + ""; filename="").append(file1.getName()).append(""")
.append(LINE_FEED);
writer.append("Content-Type: ").append(mimeType)
.append(LINE_FEED);
writer.append("Content-Transfer-Encoding: binary").append(LINE_FEED);
writer.append(LINE_FEED);
writer.flush();

所以我的上一期是写图片,下面的代码是正确的,现在工作起来很有魅力;(:

writer.append("--").append(boundary).append(LINE_FEED);
writer.append("Content-Disposition: form-data; name="" + "file1" + ""; filename="").append(file1.getName()).append(""")
.append(LINE_FEED);
writer.append("Content-Type: ").append(mimeType)
.append(LINE_FEED);
writer.append("Content-Transfer-Encoding: binary").append(LINE_FEED);
writer.append(LINE_FEED);
writer.flush()

最新更新