2015-10-26 2 views
0

Привет Я делаю приложение, которое отправляет изображение на сервер. Версия с устаревшими функциями Apache работает, но я не знаю, почему я не могу заставить обновленное решение работать. Кто-нибудь знает, где ошибка здесь?Отправить изображение с httpurlconnection

Новое решение: оно не дает ошибок в logcat, но когда я иду на сервер, ничего не было загружено. Сначала я подумал, что ошибка заключается в том, как я передал аргументы, но я пробовал несколько разных решений, например, используя Uri.builder, методы, которые кодировали параметры с помощью HashMap и stringBuilder, передавая эту строку ... и НИЧЕГО работал. Мне нужна помощь, это действительно сводит меня с ума

@Override 
    protected Void doInBackground(Void... params) { 
     ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); 
     image.compress(Bitmap.CompressFormat.JPEG, 100, byteArrayOutputStream); 
     String encodedImage = Base64.encodeToString(byteArrayOutputStream.toByteArray(), Base64.DEFAULT); 
     try { 
      byteArrayOutputStream.flush(); 
      byteArrayOutputStream.close(); 
     }catch (IOException e){ 

     } 
     HttpURLConnection connection; 
     try { 
      String urlSt = "http://phoenixcoding.tk/SavePicture.php"; 
      URL url = new URL(urlSt); 
      connection = (HttpURLConnection) url.openConnection(); 

      connection.setRequestMethod("POST"); 

      /*Uri.Builder builder = new Uri.Builder() 
        .appendQueryParameter("name", name) 
        .appendQueryParameter("image", encodedImage); 

      String query = builder.build().getEncodedQuery();*/ 

      OutputStream os = connection.getOutputStream(); 
      BufferedWriter writer = new BufferedWriter(
        new OutputStreamWriter(os, "UTF-8")); 
      writer.write("name=example&image=" + encodedImage); 

      writer.flush(); 
      writer.close(); 
      os.close(); 

      connection.connect(); 

     }catch (IOException e){ 
      e.printStackTrace(); 
     } 
     return null; 
} 

Бывший решение: он работает хорошо

@Override 
    protected Void doInBackground(Void... params) { 
     ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); 
     image.compress(Bitmap.CompressFormat.JPEG, 100, byteArrayOutputStream); 
     String encodedImage = Base64.encodeToString(byteArrayOutputStream.toByteArray(), Base64.DEFAULT); 
     try { 
      byteArrayOutputStream.flush(); 
      byteArrayOutputStream.close(); 
     }catch (IOException e){ 

     }ArrayList<NameValuePair> dataToSend = new ArrayList<NameValuePair>(); 
     dataToSend.add(new BasicNameValuePair("name", name)); 
     dataToSend.add(new BasicNameValuePair("image", encodedImage)); 

     HttpClient client = new DefaultHttpClient(); 
     HttpPost post = new HttpPost("http://phoenixcoding.tk/SavePicture.php"); 

     try{ 
      post.setEntity(new UrlEncodedFormEntity(dataToSend)); 
      client.execute(post); 
     }catch (Exception e){ 
      e.printStackTrace(); 
     } 

     return null; 

    } 

Файл SavePhoto.php:

<?php 
$name = $_POST["name"]; 
$image = $_POST["image"]; 
$decodedImage = base64_decode("$image"); 
file_put_contents("pictures/" . $name . ".JPG", $decodedImage); 

>

ответ

0

Спасибо всем за ваши ответы, я, наконец, сделал его работу. Я понятия не имею, почему это происходит, но после добавления объекта InputStream после открытия соединения изображения загружаются правильно. Все, что я сделал, это добавить следующие строки:

 InputStream is = connection.getInputStream(); 
     BufferedReader reader = new BufferedReader(new InputStreamReader(is, "iso-8859-1"), 8); 
     StringBuilder str = new StringBuilder(); 
     String strLine; 
     while ((strLine = reader.readLine()) != null) { 
      str.append(strLine + "\n"); 
     } 
     is.close(); 
1

Попробуйте это в вашем php-коде:

if(isset($_POST["image"]) && !empty($_POST["image"])){ 
     $profile_pic = ''; 
     $data= $_POST['image']; 

     $data = str_replace('data:image/png;base64,', '', $data); 
     $data = str_replace(' ', '+', $data); 
     $binary=base64_decode($data); 
     header('Content-Type: bitmap; charset=utf-8'); 
     // Images will be saved under 'www/pictures' folder 
     $new_name = $_POST['name'] . '.png'; 
     $success =file_put_contents('pictures/'.$new_name,$binary); 

     $profile_pic = $new_name; 

    } 
1

я думаю, эта линия глючит: - $decodedImage = base64_decode("$image"); и должно писать, как это вместо $decodedImage = base64_decode($image);

отлаживать сделать это: -

<?php 
file_put_contents("post.txt",print_r($_POST,true)); 
$name = $_POST["name"]; 
..... 
?> 

мнение о том, как: - http://phoenixcoding.tk/post.txt

(если файл не сохраняется, тогда есть проблема с разрешением, в этом случае создайте каталог «test» и дайте ему разрешение 755, даже если оно не работает, сделайте этот каталог как 777, а затем вы укажете http://phoenixcoding.tk/test/post.txt)

Что вы будете делать, это собрать все входящие $_POST в файл, тогда вы будете знать, какие данные будут поступать, это выяснит, где ошибка, на стороне андроида или на стороне php, если сообщение в порядке, тогда код android в порядке и проблема в php-коде.

я надеюсь, что это поможет вам фиксируя вопрос ...

благодаря