마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

안드로이드에서 웹서버로 이미지 업로드시 "+"특수문자 인식이안됩니다..

0 추천

안녕하세요 초보개발자 입니다. 

안드로이드에서 DB로 데이터를 저장하고 웹서버에 이미지를 저장 시키려하는데 웹서버에 이미지가 저장이 되지 않아 질문드립니다.

우선 비트맵을 String형으로 변환시킨후 OutputStream으로 내보냈습니다. 

public String getStringImage(Bitmap bmp) {
    if(bmp == null){
        return "";
    }
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    bmp.compress(Bitmap.CompressFormat.JPEG, bitmap_size, baos);
    byte[] imageBytes = baos.toByteArray();
    String encodedImage = Base64.encodeToString(imageBytes, Base64.DEFAULT);
    return encodedImage;
}
OutputStream outputStream = httpURLConnection.getOutputStream();
outputStream.write(postParameters.getBytes("UTF-8"));
outputStream.flush();
outputStream.close();

그런데 php받은 데이터를 확인해 보니 "+"특수문자만 인식하지 못하는지 String이미지에 +가 제외돼있었습니다. 인코딩문제인지 무슨문제인지 잘모르겠습니다. 혹시나해서 다른 특수문자들(/ , - . 등)도 보내봤지만 다른 문자들은 잘 출력됩니다.

 

 

 

익명사용자 님이 2018년 8월 16일 질문

2개의 답변

0 추천

php에서 뭔처리를 하는지는 모르겠으나,

단순히 +만 사라진다면, 

Base64.encodeToString(imageBytes, Base64.DEFAULT); 대신

Base64.encodeToString(imageBytes, Base64.URL_SAFE);  로 인코딩/디코딩 해서.

+ 문자를 - 문자로 대체 해 보세요.

 

 

익명사용자 님이 2018년 8월 16일 답변
댓글 감사합니다. 말씀해주신대로 코드수정하여 실행해보았습니다. 이번에는 특수문자가 모두 잘 출력 됩니다. 하지만 여전히 이미지 저장은 되지 않고있습니다. php 에서는 받은 데이터를 바로 file_put_contents($path,base64_decode($photo)); 이런식으로 저장하고 있습니다.
"+" 문자대신 "-" 문자가 들어가있으나,
php의 base64_decode 가 제대로 동작 안할텐데요..  php 쪽 로직도 바꿔보세요.
댓글 감사합니다.  base64_decode은 제대로 동작하고 있지 않습니다. 그저 php에서 받은값을 출력해봤습니다. 기존에 +는 빈칸으로 출력됐고, 말씀하신대로 -로 출력하였을 때는 온전히 출력이 됐습니다. 어쨋든  base64_decode은 두방법 모두다 제기능을 하지 않고 있습니다.
<?php
    include_once "koneksi.php";
   
    class emp{}
   
    $image = $_POST['image'];
    $name = $_POST['name'];
   
    if (empty($name)) {
        $response = new emp();
        $response->success = 0;
        $response->message = "Please dont empty Name.";
        die(json_encode($response));
    }
    else {

        $random = random_word(20);       
        $path = "images/".$random.".png";
        // sesuiakan ip address laptop/pc atau URL server
        $actualpath = "http://192.168.1.92/android/upload_image/$path";
       
        $query = mysqli_query($con, "INSERT INTO volley_upload (photo,name) VALUES ('$actualpath','$name')");


       
        if ($query){
            file_put_contents($path,base64_decode($image));
           
            $response = new emp();
            $response->success = 1;
            $response->message = $image;
            die(json_encode($response));
        } else{
            $response = new emp();
            $response->success = 0;
            $response->message = $image;
            die(json_encode($response));
        }
    }   
   
    // fungsi random string pada gambar untuk menghindari nama file yang sama
    function random_word($id = 20){
        $pool = '1234567890abcdefghijkmnpqrstuvwxyz';
       
        $word = '';
        for ($i = 0; $i < $id; $i++){
            $word .= substr($pool, mt_rand(0, strlen($pool) -1), 1);
        }
        return $word;
    }

    mysqli_close($con);
   
?>
php 소스입니다.
https://stackoverflow.com/questions/11511511/how-to-save-a-png-image-server-side-from-a-base64-data-string
 를 살펴 보세요.. 전부 문자열 치환해서 저장합니다.
0 추천
아마 postParameters 생성하는 부분이 잘못 된것 같네요. + 가 없어 진다는 것은 content type을 application/x-www-form-urlencoded로 보내고 있는데 해당 파라미터를 제대로 url encode하고 있지 않기 때문으로 보입니다. URLEncoder.encode로 encoded image string을 한번더 변환해야 정상 처리 될겁니다.
회색 (21,340 포인트) 님이 2018년 8월 17일 답변
...