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 上传的位图不可用的主要内容,如果未能解决你的问题,请参考以下文章

android 连接网络的简单实例

Android中的网络编程

HttpUrlConnect post提交

如何使用 HttpUrlConnect 使用 java 查询 Github graphql API

android中的HttpUrlConnection的使用之一

Android探索之HttpURLConnection网络请求