为什么不能使用httpurlconnection发布整个base64字符串?

时间:2019-03-08 12:53:26

标签: java php android

我想将图像上传到服务器。

  1. 我得到了图像的位图,并将其编码为base64。
  2. 我使用encodeToString方法将图像的base64转换为字符串。
  3. 我使用httpurlconnection将字符串发布到PHP。实际上,我是从PHP获得的字符串,而不是整个字符串。我没有任何错误。请给我反馈!
public String httpURLConnectionPost(final String urlString){    
        String result="";    
        try {
            URL url = new URL(urlString);
            HttpURLConnection connection = (HttpURLConnection) url.openConnection();
            connection.setRequestMethod("POST");
            connection.setDoOutput(true);
            connection.setDoInput(true);
            connection.setUseCaches(false);
            connection.connect();

            Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.download);
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            bitmap.compress(Bitmap.CompressFormat.JPEG, 100, baos);
            byte[] imageBytes = baos.toByteArray();
            String encodedImage = Base64.encodeToString(imageBytes, Base64.NO_CLOSE);

            String body= "image="+encodedImage;

            Log.d("serverPostData","body = " +body);

            BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(connection.getOutputStream(), "UTF-8"));
            writer.write(body);
            writer.close();

            int responseCode = connection.getResponseCode();
            if(responseCode == HttpURLConnection.HTTP_OK){
                InputStream inputStream = connection.getInputStream();

                StringBuilder stringBuilder = new StringBuilder();
                String line;

                BufferedReader br = new BufferedReader(new InputStreamReader(inputStream));
                while ((line = br.readLine()) != null) {
                    stringBuilder .append(line);
                }
                result = stringBuilder .toString();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

        return result;
    }

php获取了字符串并对其进行了解码。

<?php

include("mysqli_connect.php");

$image= $_POST['image'];

$a = uniqid() ; 

$ImagePath = "good/$a.JPEG";

$ServerURL = "https://172.30.10.1/$ImagePath";

 $InsertSQL = "INSERT INTO Photoshop(photo) VALUES('$ServerURL')" ;

 if(mysqli_query($connect, $InsertSQL)){
          file_put_contents($ImagePath,base64_decode($image));
          echo $image;          
 }else{
    echo "failed";
}

mysqli_close();
?>

2 个答案:

答案 0 :(得分:0)

尝试将图像转换为base64:

Uri uri = data.getData();
Bitmap bitmap = MediaStore.Images.Media.getBitmap(this.getContentResolver(), uri);
String encodedImageData = getEncoded64ImageStringFromBitmap(bitmap);

现在在API中传递数据:

 JsonObject data1 = new JsonObject();
 data1.addProperty("imageData", "data:image/png;base64," + encodedImageData);

现在设置ImageBitmap:

image.setImageBitmap(bitmap);

这是方法:

private String getEncoded64ImageStringFromBitmap(Bitmap bitmap) {

    ByteArrayOutputStream stream = new ByteArrayOutputStream();
    bitmap.compress(Bitmap.CompressFormat.JPEG, 70, stream);
    byte[] byteFormat = stream.toByteArray();
    // get the base 64 string
    String imgString = Base64.encodeToString(byteFormat, Base64.NO_WRAP);

    return imgString;
}

对于HttpUrlConnection,请尝试...

jsonObject = new JSONObject();
jsonObject.put("imageString", encodedImage);
String data = jsonObject.toString();
String yourURL = "yourphpfileurl";
URL url = new URL(yourURL);

HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setDoOutput(true);
connection.setDoInput(true);
connection.setRequestMethod("POST");
connection.setFixedLengthStreamingMode(data.getBytes().length);
connection.setRequestProperty("Content-Type", "application/json;charset=UTF-8");

OutputStream out = new BufferedOutputStream(connection.getOutputStream());
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(out, "UTF-8"));
writer.write(data);
writer.flush();
writer.close();
out.close();
connection.connect();

InputStream in = new BufferedInputStream(connection.getInputStream());
BufferedReader reader = new BufferedReader(new InputStreamReader(
                in, "UTF-8"));
        StringBuilder sb = new StringBuilder();
        String line = null;
        while ((line = reader.readLine()) != null) {
            sb.append(line);
        }
        in.close();
        String result = sb.toString();
        connection.disconnect();

希望这对您有用...

答案 1 :(得分:0)

我解决了我的问题,即base64需要将空替换为“ +”。

<?php

include("mysqli_connect.php");

$image= $_POST['image'];
$change =  str_replace(" ","+",$image);

$a = uniqid() ; 

$ImagePath = "good/$a.JPEG";

$ServerURL = "https://172.30.10.1/$ImagePath";

 $InsertSQL = "INSERT INTO Photoshop(photo) VALUES('$ServerURL')" ;

 if(mysqli_query($connect, $InsertSQL)){
          file_put_contents($ImagePath,base64_decode($change ));
          echo $image;          
 }else{
    echo "failed";
}

mysqli_close();
?>