Android端Base64编码图片上传PHP后端后无法显示问题
解决Base64图片转存后无法显示的问题
你的问题很典型——图片能成功保存但无法显示,核心原因是Android端对Base64字符串多做了一次URL编码,而PHP端没有对应解码,导致最终解码出的二进制数据损坏。
问题根源分析
看Android代码里这行关键代码:
String encodeimage = URLEncoder.encode(Base64.encodeToString(bytearrayimage , Base64.DEFAULT) , "UTF-8");
Base64编码后的字符串包含+、/、=这类特殊字符,你用URLEncoder.encode把它们转成了%2B、%2F、%3D这类URL安全编码。但PHP端直接对接收的字符串做base64_decode,相当于把URL编码后的字符当成了Base64内容来解码,自然得不到正确的图片二进制数据,保存的文件就是损坏的。
解决方案(二选一即可)
方案1:修改Android代码,移除多余的URL编码
既然你是通过JSON传递数据(不是直接拼在URL里),完全不需要做URL编码。直接保留Base64编码结果即可,还可以用Base64.NO_WRAP避免默认编码产生的换行符,更稳妥:
Bitmap newImage = (Bitmap) MediaStore.Images.Media.getBitmap(this.getContentResolver() , data.getData()); im.setImageBitmap(newImage); ByteArrayOutputStream baos = new ByteArrayOutputStream(); newImage.compress(Bitmap.CompressFormat.JPEG , 100 , baos); byte[] bytearrayimage = baos.toByteArray(); // 移除URLEncoder.encode,改用NO_WRAP避免换行 String encodeimage = Base64.encodeToString(bytearrayimage , Base64.NO_WRAP); Toast.makeText(getApplicationContext() , String.valueOf(encodeimage.length()) , Toast.LENGTH_SHORT).show(); try { JSONObject json = new JSONObject(); json.put("type" , "picprofile"); json.put("username" , username); json.put("image" , encodeimage); new ConnectServer().execute("https://estate.shikmelk.ir/api/android/upload.php" , json.toString()); } catch (JSONException j) { j.printStackTrace(); }
方案2:修改PHP代码,先做URL解码再Base64解码
如果你不想改动Android端代码,可以在PHP端先对接收的字符串做URL解码:
$img = urldecode($json["image"]); // 先解码URL编码 $imgname = $username . "profile.jpg"; $fopen = fopen("../../main/picprofile/" . $imgname , "wb"); fwrite($fopen , base64_decode($img)); fclose($fopen);
额外检查点
- 先验证Android端的
newImage是否有效:比如你已经用im.setImageBitmap(newImage)显示了,确认图片能正常显示 - 检查PHP端的文件路径是否正确,目标目录
../../main/picprofile/是否存在,且服务器有写入权限 - 可以在Android端打印
encodeimage的前20个字符,在PHP端打印$img的前20个字符,对比是否一致,排查传输过程中是否有字符丢失
内容的提问来源于stack exchange,提问作者b.hosseini
相关产品推荐
相关产品推荐

