Android:通过HttpURLConnection上载的位图不可用

Android:通过HttpURLConnection上载的位图不可用,android,bitmap,upload,format,corrupt,Android,Bitmap,Upload,Format,Corrupt,我正在使用Android应用程序上传相机拍摄的图像。相机返回位图,并将其传递给上载任务。服务器接收图像并保存,但似乎格式不正确;我看不到图像。AndroidBitmap.compress()函数有什么我不知道的吗?我不熟悉图像格式,因此非常感谢您的帮助 以下是写入位图的代码: HttpURLConnection conn = (HttpURLConnection) url.openConnection(); conn.setReadTimeout(10000); conn.setConnectT

我正在使用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))

解决了这个问题。图像数据流仍然需要格式化为jpeg文件。网站上的php需要修改

下面是将数据转换为图像并保存的php代码段

$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代码?你上传的文件中有多少字节?保存的一个中有多少?它被上传到web服务器并通过php进行处理。位图写入的缓冲区在调试器中读取字节[4505]@3894(需要查找该语法的含义)。复制到本地驱动器的文件正在读取4882字节。在android上,它永远不会保存为实际文件。为什么在第二个表单数据中没有内容类型image/jpeg?查看保存的文件以查看差异。我尝试添加,但运气不佳:os.write((“内容处置:表单数据;名称=\“fileToUpload\”name=“+”ups.jpg“+lnEnd”);write(((“内容类型:image/jpeg”+lnEnd.getBytes());write((“内容传输编码:binary”+lnEnd.getBytes());