Android:通过 HttpURLConnection 上传的位图不可用
Posted
技术标签:
【中文标题】Android:通过 HttpURLConnection 上传的位图不可用【英文标题】:Android: Bitmap uploaded via HttpURLConnection not usable 【发布时间】:2015-03-28 20:44:19 【问题描述】:我正在使用 android 应用上传用相机拍摄的图像。相机返回位图,传给上传任务。服务器接收到图片并保存,但似乎格式错误;我无法查看图像。我对 Android Bitmap.compress()
功能有什么遗漏吗?我不熟悉图像格式,因此非常感谢任何帮助。
这是写位图的代码:
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setReadTimeout(10000);
conn.setConnectTimeout(15000);
conn.setRequestMethod("POST");
conn.setDoInput(true);
conn.setDoOutput(true);
conn.setRequestProperty("Connection", "Keep-Alive");
conn.setRequestProperty("ENCTYPE", "multipart/form-data");
conn.setRequestProperty("Content-Type", "multipart/form-data;boundary=" + boundary);
conn.setRequestProperty("imageToUpload", "ups.jpg");
String sUserID = Integer.toString(mUserID);
OutputStream os = conn.getOutputStream();
os.write((dbHyphen + boundary + lnEnd).getBytes());
os.write(("Content-Disposition: form-data; name=\"p\"" + lnEnd).getBytes());
os.write(("Content-Type: text/plain; charset=UTF-8"+ lnEnd).getBytes());
os.write(lnEnd.getBytes());
os.write(sUserID.getBytes());os.write(lnEnd.getBytes());
os.write(lnEnd.getBytes());
os.write((dbHyphen + boundary + lnEnd).getBytes());
os.write(("Content-Disposition: form-data; name=\"imageToUpload\";filename="
+ "ups.jpg" + lnEnd).getBytes());
os.write((lnEnd).getBytes());
ByteArrayOutputStream bos = new ByteArrayOutputStream();
mImage.compress(Bitmap.CompressFormat.JPEG, 85, bos);
byte[] bitmapdata = bos.toByteArray();
os.write(bitmapdata);
os.write((lnEnd).getBytes());
os.write((dbHyphen + boundary + dbHyphen + lnEnd).getBytes());
os.close();
编辑:它收到的上传并通过 php 保存
move_uploaded_file($_FILES['imageToUpload']['tmp_name'], $file_path))
【问题讨论】:
什么样的服务器?你是责怪服务器还是你的 Android 代码? 你上传的文件有多少字节?保存的有多少? 上传到web服务器,通过php处理。位图写入的缓冲区在调试器中读取 byte[4505]@3894(需要查找该语法的含义)。复制到我的本地驱动器后的文件读取 4,882 字节。它永远不会被保存为 android 上的实际文件。 为什么第二个表单数据没有内容类型image/jpeg?查看保存的文件以查看差异。 我尝试添加,但没有运气: os.write(("Content-Disposition: form-data; name=\"fileToUpload\";name="+ "ups.jpg" + lnEnd).获取字节()); os.write(("Content-Type: image/jpeg"+ lnEnd).getBytes()); os.write(("Content-Transfer-Encoding: binary" + lnEnd).getBytes()); 【参考方案1】:解决了这个问题。图像数据流仍然需要格式化成 jpeg 文件。网站上的php需要修改。
这里是php sn -p 将数据转换成图片并保存。
$data = file_get_contents($_FILES['imageToUpload']['tmp_name']);
$imageFile = imagecreatefromstring($data);
$imageName = "test.jpeg";
$imageSave = imagejpeg($imageFile,$imageName,100);
imagedestroy($imageFile);
Android 的修改代码:
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setReadTimeout(10000);
conn.setConnectTimeout(15000);
conn.setRequestMethod("POST");
conn.setDoInput(true);
conn.setDoOutput(true);
conn.setRequestProperty("Connection", "Keep-Alive");
conn.setRequestProperty("ENCTYPE", "multipart/form-data");
conn.setRequestProperty("Content-Type", "multipart/form-data;boundary=" + boundary);
conn.setRequestProperty("imageToUpload", "ups.jpg");
String sUserID = Integer.toString(mUserID);
OutputStream os = conn.getOutputStream();
os.write((dbHyphen + boundary + lnEnd).getBytes());
os.write(("Content-Disposition: form-data; name=\"p\"" + lnEnd).getBytes());
os.write(("Content-Type: text/plain; charset=UTF-8"+ lnEnd).getBytes());
os.write(lnEnd.getBytes());
os.write(sUserID.getBytes());os.write(lnEnd.getBytes());
os.write(lnEnd.getBytes());
os.write((dbHyphen + boundary + lnEnd).getBytes());
os.write(("Content-Disposition: form-data; name=\"imageToUpload\";filename="+ "ups.jpg" + lnEnd).getBytes());
os.write(("Content-Type: image/jpeg; charset=UTF-8"+ lnEnd).getBytes());//"+ lnEnd).getBytes());
//os.write(("Content-Transfer-Encoding: binary" + lnEnd).getBytes());
os.write((lnEnd).getBytes());
ByteArrayOutputStream bos = new ByteArrayOutputStream();
mImage.compress(Bitmap.CompressFormat.JPEG, 25, bos);
byte[] bitmapdata = bos.toByteArray();
int lng = bitmapdata.length;
os.write(bitmapdata);
os.write((lnEnd).getBytes());
os.write((dbHyphen + boundary + dbHyphen + lnEnd).getBytes());
os.close();
【讨论】:
以上是关于Android:通过 HttpURLConnection 上传的位图不可用的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 HttpUrlConnect 使用 java 查询 Github graphql API