본문 바로가기

프로그래밍/안드로이드

안드로이드 php 파일 전송 예제



1. manifest.xml에 <uses-permission android:name="android.permission.INTERNET" />와 <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>와 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>를 추가해야 한다. (빨간줄로 된 부분)

<manifest.xml 파일>

<?xml version="1.0" encoding="utf-8"?>
  <manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="com.androidexample.uploadtoserver"
      android:versionCode="1"
      android:versionName="1.0" >
   
      <uses-sdk
          android:minSdkVersion="8"
 android:targetSdkVersion="18"/>
       
      <uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
   
      <application
          android:allowBackup="true"
          android:icon="@drawable/ic_launcher"
          android:label="@string/app_name"
          android:theme="@style/AppTheme" >
          <activity
              android:name=".MainActivity"
              android:label="@string/app_name" >
              <intent-filter>
                  <action android:name="android.intent.action.MAIN" />
   
                  <category android:name="android.intent.category.LAUNCHER" />
              </intent-filter>
          </activity>
      </application>
   
  </manifest>




2.xml파일에 다음을 Button과 TextView를 추가해야 테스트 할 수 있다

<activity_main.xml 파일>

<?xml version="1.0" encoding="utf-8"?>
 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
     android:orientation="vertical"
     android:layout_width="fill_parent"
     android:layout_height="fill_parent"
     >
     <Button
         android:layout_width="fill_parent"
         android:layout_height="wrap_content"
         android:text="Click To Upload File"
         android:id="@+id/uploadButton"
     />
       
     <TextView
         android:layout_width="fill_parent"
         android:layout_height="wrap_content"
         android:text=""
         android:id="@+id/messageText"
         android:textColor="#000000"
         android:textStyle="bold"
     />
  </LinearLayout>




3. MainActivity_java에 다음을 복붙하고 원하는 서버주소와 파일이름만 수정해주면 된다. 

<activity_main.java 파일>

import java.io.DataOutputStream;

import java.io.File;

import java.io.FileInputStream;

import java.net.HttpURLConnection;

import java.net.MalformedURLException;

import java.net.URL;

 

import android.app.Activity;

import android.app.ProgressDialog;

import android.os.Bundle;

import android.util.Log;

import android.view.View;

import android.view.View.OnClickListener;

import android.widget.Button;

import android.widget.TextView;

import android.widget.Toast;

 

public class MainActivity extends Activity{

                 

    TextView messageText;

    Button uploadButton;

    int serverResponseCode = 0;

    ProgressDialog dialog = null;

       

    String upLoadServerUri = null;

    

    /**********  File Path *************/

    final String uploadFilePath = "storage/emulated/0/";//경로를 모르겠으면갤러리 어플리케이션 가서 메뉴->상세 정보

    final String uploadFileName = "testimage.jpg"//전송하고자하는 파일 이름

                 

                  @Override

                  protected void onCreate(Bundle savedInstanceState) {

                                   super.onCreate(savedInstanceState);

                                   setContentView(R.layout.activity_main);

                                   uploadButton = (Button)findViewById(R.id.uploadButton);

        messageText  = (TextView)findViewById(R.id.messageText);

        

        messageText.setText("Uploading file path :- '/mnt/sdcard/"+uploadFileName+"'");

        

        /************* Php script path ****************/

        upLoadServerUri = "http://180.64.63.139/UploadToServer.php";//서버컴퓨터의 ip주소

        

        uploadButton.setOnClickListener(new OnClickListener() {           

            @Override

            public void onClick(View v) {

                

                dialog = ProgressDialog.show(MainActivity.this"""Uploading file..."true);

                

                new Thread(new Runnable() {

                        public void run() {

                             runOnUiThread(new Runnable() {

                                    public void run() {

                                        messageText.setText("uploading started.....");

                                    }

                                });                     

                          

                             uploadFile(uploadFilePath + "" + uploadFileName);

                                                     

                        }

                      }).start();       

                }

            });

    }

     

    public int uploadFile(String sourceFileUri) {

          

          String fileName = sourceFileUri;

 

          HttpURLConnection conn = null;

          DataOutputStream dos = null; 

          String lineEnd = "\r\n";

          String twoHyphens = "--";

          String boundary = "*****";

          int bytesRead, bytesAvailable, bufferSize;

          byte[] buffer;

          int maxBufferSize = 1 * 1024 * 1024;

          File sourceFile = new File(sourceFileUri);

          

          if (!sourceFile.isFile()) {

              

               dialog.dismiss();

               

               Log.e("uploadFile""Source File not exist :"

                                   +uploadFilePath + "" + uploadFileName);

               

               runOnUiThread(new Runnable() {

                   public void run() {

                       messageText.setText("Source File not exist :"

                               +uploadFilePath + "" + uploadFileName);

                   }

               });

               

               return 0;

           

          }

          else

          {

               try {

                   

                     // open a URL connection to the Servlet

                   FileInputStream fileInputStream = new FileInputStream(sourceFile);

                   URL url = new URL(upLoadServerUri);

                   

                   // Open a HTTP  connection to  the URL

                   conn = (HttpURLConnection) url.openConnection();

                   conn.setDoInput(true); // Allow Inputs

                   conn.setDoOutput(true); // Allow Outputs

                   conn.setUseCaches(false); // Don't use a Cached Copy

                   conn.setRequestMethod("POST");

                   conn.setRequestProperty("Connection""Keep-Alive");

                   conn.setRequestProperty("ENCTYPE""multipart/form-data");

                   conn.setRequestProperty("Content-Type""multipart/form-data;boundary=" + boundary);

                   conn.setRequestProperty("uploaded_file", fileName);

                   

                   dos = new DataOutputStream(conn.getOutputStream());

         

                   dos.writeBytes(twoHyphens + boundary + lineEnd);

                   dos.writeBytes("Content-Disposition: form-data; name=\"uploaded_file\";filename=\""

                           + fileName + "\"" + lineEnd);

                    

                   dos.writeBytes(lineEnd);

         

                   // create a buffer of  maximum size

                   bytesAvailable = fileInputStream.available();

         

                   bufferSize = Math.min(bytesAvailable, maxBufferSize);

                   buffer = new byte[bufferSize];

         

                   // read file and write it into form...

                   bytesRead = fileInputStream.read(buffer, 0, bufferSize); 

                     

                   while (bytesRead > 0) {

                       

                     dos.write(buffer, 0, bufferSize);

                     bytesAvailable = fileInputStream.available();

                     bufferSize = Math.min(bytesAvailable, maxBufferSize);

                     bytesRead = fileInputStream.read(buffer, 0, bufferSize);  

                     

                    }

         

                   // send multipart form data necesssary after file data...

                   dos.writeBytes(lineEnd);

                   dos.writeBytes(twoHyphens + boundary + twoHyphens + lineEnd);

         

                   // Responses from the server (code and message)

                   serverResponseCode = conn.getResponseCode();

                   String serverResponseMessage = conn.getResponseMessage();

                    

                   Log.i("uploadFile""HTTP Response is : "

                           + serverResponseMessage + ": " + serverResponseCode);

                   

                   if(serverResponseCode == 200){

                       

                       runOnUiThread(new Runnable() {

                            public void run() {

                                

                                String msg = "File Upload Completed.\n\n See uploaded file here : \n\n"

                                              +uploadFileName;

                                

                                messageText.setText(msg);

                                Toast.makeText(MainActivity.this"File Upload Complete.",

                                             Toast.LENGTH_SHORT).show();

                            }

                        });               

                   }   

                   

                   //close the streams //

                   fileInputStream.close();

                   dos.flush();

                   dos.close();

                    

              catch (MalformedURLException ex) {

                  

                  dialog.dismiss(); 

                  ex.printStackTrace();

                  

                  runOnUiThread(new Runnable() {

                      public void run() {

                          messageText.setText("MalformedURLException Exception : check script url.");

                          Toast.makeText(MainActivity.this"MalformedURLException",

                                                              Toast.LENGTH_SHORT).show();

                      }

                  });

                  

                  Log.e("Upload file to server""error: " + ex.getMessage(), ex); 

              catch (Exception e) {

                  

                  dialog.dismiss(); 

                  e.printStackTrace();

                  

                  runOnUiThread(new Runnable() {

                      public void run() {

                          messageText.setText("Got Exception : see logcat ");

                          Toast.makeText(MainActivity.this"Got Exception : see logcat ",

                                  Toast.LENGTH_SHORT).show();

                      }

                  });

                  Log.e("Upload file to server Exception""Exception : "

                                                   + e.getMessage(), e); 

              }

              dialog.dismiss();

              return serverResponseCode;

              

           // End else block

         }

}




4.php 코드 (서버컴퓨터에 C:\APM_Setup\htdocs/UploadToServer.php)

<UploadToServer.php 파일> 

<?php
  
    $file_path = "uploads/";
     
    $file_path = $file_path . basename( $_FILES['uploaded_file']['name']);
    if(move_uploaded_file($_FILES['uploaded_file']['tmp_name'], $file_path)) {
        echo "success";
    } else{
        echo "fail";
    }
 ?>




5.실행화면 (서버 컴퓨터에 저장된 화면)




6.유의사항 

1.서버 컴퓨터에 지정된 경로 폴더(이 글에서는 uploads폴더)를 미리 만들어두지 않으면, 성공적으로 서버컴퓨터로 파일이 전송되지 않는다. 

2.서버 컴퓨터에 있는 업로드 폴더 권한을 최대한으로 풀어준다 (보안에는 좋지 않지만)

3.파일전송시 jpg같은 확장자를 꼭 지정해야한다. 

4.폴더 경로의 마지막에 /을 쓰지 않으면 정상적으로 사진이 업로드 되지 않는다 (예:/storage/emulated/0/ ) 


+ 위에 똑같이 따라하셔도 안 되시는 분은 아래의 방법을 한번더 시도하시길 바랍니다. 

이현민이라는 분이 문의 주셨는데 자체적으로 해결하셨다고 합니다.

<APM 매니저의 서버 환경설정 변경 방법>

1-Apache성정 탭에서 ServerName, DirectoryIndex  변경

2-PHP설정 탭에서 경로 변경



※작성자의 말

출처 : http://androidexample.com/Upload_File_To_Server_-_Android_Example/index.php?view=article_discription&aid=83&aaid=106