2014-01-23 3 views
6

내 앱에서 내 장치에서 로컬 웹 서버로 이미지를 업로드 중입니다 ... 코드 실행 후 .jpg 파일이 서버에서 생성되지만 열리지 않습니다. 그리고 서버에있는 파일의 크기가 원본 파일과 다릅니다.안드로이드에서 PHP 서버로 이미지 업로드

안드로이드 활동 -

public class MainActivity extends Activity { 


private static int RESULT_LOAD_IMAGE = 1; 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    Button btnSelectImage=(Button) findViewById(R.id.uploadButton); 
    btnSelectImage.setOnClickListener(new OnClickListener() { 

     @Override 
     public void onClick(View v) { 

     Intent i=new Intent(Intent.ACTION_PICK,android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI); 

     startActivityForResult(i, RESULT_LOAD_IMAGE); 

     } 
    }); 

} 

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    // TODO Auto-generated method stub 
    super.onActivityResult(requestCode, resultCode, data); 

    if (requestCode == RESULT_LOAD_IMAGE && resultCode == RESULT_OK && data!=null) { 

     Uri selectedImage=data.getData(); 
     String[] filePathColumn={MediaStore.Images.Media.DATA}; 

     Cursor cursor = getContentResolver().query(selectedImage,filePathColumn, null, null, null); 
     cursor.moveToFirst(); 

     int columnIndex = cursor.getColumnIndex(filePathColumn[0]); 
     String picturePath = cursor.getString(columnIndex); 
     cursor.close(); 


     Bitmap bitmap=BitmapFactory.decodeFile(picturePath); 

     ImageView im = (ImageView) findViewById(R.id.imgBox); 
     im.setImageBitmap(bitmap); 

     /* 
     * Convert the image to a string 
     * */ 
     ByteArrayOutputStream stream = new ByteArrayOutputStream(); 
     bitmap.compress(Bitmap.CompressFormat.PNG, 90, stream); //compress to which format you want. 
     byte [] byte_arr = stream.toByteArray(); 
     String image_str = Base64.encodeToString(byte_arr,Base64.DEFAULT); 

     /* 
     * Create a name value pair for the image string to be passed to the server 
     * */ 
     ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();    
     nameValuePairs.add(new BasicNameValuePair("image",image_str)); 


     JSONObject jsonString=new JSONObject(); 
     try { 
      jsonString.put("img", image_str); 
     } catch (JSONException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

     new uploadImageToPhp().execute(jsonString); 



    } 


} 
@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    // Inflate the menu; this adds items to the action bar if it is present. 
    getMenuInflater().inflate(R.menu.main, menu); 


    return true; 
} 
public class uploadImageToPhp extends AsyncTask<JSONObject, Void, Void> 
{ 
    String dataToSend=null; 

    public static final String prefix="http://";              //prefix of the urls 
    public static final String server_ip="172.16.26.155";             //the ip address where the php server is located  

    public static final String completeServerAddress=prefix+server_ip+"/test_upload/upload_image.php";     //Exact location of the php files 

    @Override 
    protected Void doInBackground(JSONObject... params) { 

     dataToSend="image="+params[0]; 
     communicator(completeServerAddress, dataToSend); 




     return null; 
    } 

    public void communicator(String urlString,String dataToSend2) 
    { 
     String result=null; 

     try 
     { 
      URL url=new URL(urlString); 
      URLConnection conn=url.openConnection(); 

      HttpURLConnection httpConn=(HttpURLConnection) conn; 
      httpConn.setRequestProperty("Accept", "application/json"); 
      httpConn.setRequestProperty("accept-charset", "UTF-8"); 
      httpConn.setRequestMethod("POST");   
      httpConn.connect(); 

      //Create an output stream to send data to the server 
      OutputStreamWriter out=new OutputStreamWriter(httpConn.getOutputStream()); 
      out.write(dataToSend2); 
      out.flush(); 

      int httpStatus = httpConn.getResponseCode();    
      System.out.println("Http status :"+httpStatus); 

      if(httpStatus==HttpURLConnection.HTTP_OK) 
      { 
       Log.d("HTTP STatus", "http connection successful"); 

       BufferedReader in = new BufferedReader(new InputStreamReader(httpConn.getInputStream(),"UTF-8")); 
       StringBuilder sb = new StringBuilder(); 
       String inputLine; 
       while ((inputLine = in.readLine()) != null) 
       { 
        System.out.println(inputLine); 
        sb.append(inputLine+"\n"); 
       } 
       in.close(); 
       result=sb.toString();      

       try 
       { 

        //jsonResult = new JSONObject(result); 
       } 
       catch(Exception e) 
       { 
        Log.e("JSON Parser", "Error parsing data " + e.toString()); 
       } 


      } 
      else 
      { 
       System.out.println("Somthing went wrong"); 
      } 
     } catch (MalformedURLException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 


    } 


} 

} 

PHP 코드 : - 코드 아래

$recievedJson=$_REQUEST['image']; 
$imageContent=json_decode($recievedJson,true); 
$base=$imageContent["img"]; 

$binary=base64_decode($base); 

echo $binary; 
header('Content-Type: bitmap; charset=utf-8'); 
$file = fopen('uploaded_image.jpg', 'wb'); 
fwrite($file, $binary); 
fclose($file); 

답변

8

사용. 그것은 똑같이 할 것입니다.

public class UploadImage extends Activity { 
    InputStream inputStream; 
     @Override 
    public void onCreate(Bundle icicle) { 
      super.onCreate(icicle); 
      setContentView(R.layout.main); 

      Bitmap bitmap = BitmapFactory.decodeResource(getResources(),R.drawable.icon);   ByteArrayOutputStream stream = new ByteArrayOutputStream(); 
      bitmap.compress(Bitmap.CompressFormat.PNG, 90, stream); //compress to which format you want. 
      byte [] byte_arr = stream.toByteArray(); 
      String image_str = Base64.encodeBytes(byte_arr); 
      ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(); 

      nameValuePairs.add(new BasicNameValuePair("image",image_str)); 

      Thread t = new Thread(new Runnable() { 

      @Override 
      public void run() { 
        try{ 
         HttpClient httpclient = new DefaultHttpClient(); 
         HttpPost httppost = new HttpPost("server-link/folder-name/upload_image.php"); 
         httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs)); 
         HttpResponse response = httpclient.execute(httppost); 
         String the_string_response = convertResponseToString(response); 
         runOnUiThread(new Runnable() { 

           @Override 
           public void run() { 
            Toast.makeText(UploadImage.this, "Response " + the_string_response, Toast.LENGTH_LONG).show();       
           } 
          }); 

        }catch(Exception e){ 
          runOnUiThread(new Runnable() { 

          @Override 
          public void run() { 
           Toast.makeText(UploadImage.this, "ERROR " + e.getMessage(), Toast.LENGTH_LONG).show();        
          } 
         }); 
          System.out.println("Error in http connection "+e.toString()); 
        } 
      } 
     }); 
     t.start(); 
     } 

     public String convertResponseToString(HttpResponse response) throws IllegalStateException, IOException{ 

      String res = ""; 
      StringBuffer buffer = new StringBuffer(); 
      inputStream = response.getEntity().getContent(); 
      int contentLength = (int) response.getEntity().getContentLength(); //getting content length….. 
       runOnUiThread(new Runnable() { 

      @Override 
      public void run() { 
       Toast.makeText(UploadImage.this, "contentLength : " + contentLength, Toast.LENGTH_LONG).show();      
      } 
     }); 

      if (contentLength < 0){ 
      } 
      else{ 
        byte[] data = new byte[512]; 
        int len = 0; 
        try 
        { 
         while (-1 != (len = inputStream.read(data))) 
         { 
          buffer.append(new String(data, 0, len)); //converting to string and appending to stringbuffer….. 
         } 
        } 
        catch (IOException e) 
        { 
         e.printStackTrace(); 
        } 
        try 
        { 
         inputStream.close(); // closing the stream….. 
        } 
        catch (IOException e) 
        { 
         e.printStackTrace(); 
        } 
        res = buffer.toString();  // converting stringbuffer to string….. 

        runOnUiThread(new Runnable() { 

        @Override 
        public void run() { 
         Toast.makeText(UploadImage.this, "Result : " + res, Toast.LENGTH_LONG).show(); 
        } 
       }); 
        //System.out.println("Response => " + EntityUtils.toString(response.getEntity())); 
      } 
      return res; 
     } 
} 

PHP 코드

<?php 
    $base=$_REQUEST['image']; 
    $binary=base64_decode($base); 
    header('Content-Type: bitmap; charset=utf-8'); 
    $file = fopen('uploaded_image.jpg', 'wb'); 
    fwrite($file, $binary); 
    fclose($file); 
    echo 'Image upload complete!!, Please check your php file directory……'; 
?> 
+0

난 HttpURLConnection의를 사용할 수 없습니다 ??? –

+0

나는 다른 모든 통신에 대해 httpurlconnection을 사용하고 있으므로 이미지를 업로드하는 데 동일한 것을 사용하려고 생각했습니다. –

+0

그러나이 방법은 이미지를 업로드하는 가장 쉬운 방법이며이 코드는 완벽하게 작동합니다. – InnocentKiller

0
public JSONObject getJSONFromUrlPost(String url, String userid, 
       String filepath, String status) { 
      HttpClient httpclient = new DefaultHttpClient(); 
      HttpPost httppost = new HttpPost(url); 
      MultipartEntity entity = new MultipartEntity(
        HttpMultipartMode.BROWSER_COMPATIBLE); 
      HttpParams httpParams = httpclient.getParams(); 
      httpParams.setIntParameter(CoreConnectionPNames.SO_TIMEOUT, 100000); 
      try { 
       entity.addPart("id", 
         new StringBody(userid, Charset.forName("UTF-8"))); 
       entity.addPart("sharestatus", 
         new StringBody(status, Charset.forName("UTF-8"))); 
       entity.addPart("file", new FileBody(new File(filepath))); 
       httppost.setEntity(entity); 
       ResponseHandler<String> responseHandler = new BasicResponseHandler(); 
       String response = httpclient.execute(httppost, responseHandler); 
       return new JSONObject(response.toString()); 
      } catch (Exception e) { 
       return null; 
      } 
     } 



------------------------------------------------------------------ 
in main.java 



JSONParser js = new JSONParser(); 
String url="";// upload file with Server url 
      JSONObject data = js.getJSONFromUrlPost(url); 
      String response; 
      try { 
       response = data.getString("Msg"); 
       if (response.contains("Succesfully upload file")) { 
        JSONObject jsondata = new JSONObject(data.getString("Data")); 
        Fileurl = jsondata.getString("Url"); 
       } 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
관련 문제