일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- Job
- shceduler
- Background
- livedatam
- Service
- PHP
- 빈
- Android
- 검사
- Library
- epmty
- jobdispatcher
- jobschduler
- firebase
- workmanager
- schedule
- alarmanager
- Today
- Total
에몽이
이미지 서버에 올리기 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" ?> 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" ?> 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.경로의 마지막에 /을 쓰지 않으면 정상적으로 작동되지 않는다.
+ 위에 똑같이 따라하셔도 안 되시는 분은 아래의 방법을 한번더 시도하시길 바랍니다.
이현민이라는 분이 문의 주셨는데 자체적으로 해결하셨다고 합니다.
<APM 매니저의 서버 환경설정 변경 방법>
1-Apache성정 탭에서 ServerName, DirectoryIndex 변경
2-PHP설정 탭에서 경로 변경
※작성자의 말
여태껏 구글링해서 성공적으로 되는 소스의 링크만 걸었지만, 아래의 링크가 약간의 오류와 따라하기 힘든 점이 다소 있어서 수정하였습니다. 많은 도움이 되셨길 바랍니다. 문의사항은 댓글 주세요.
'android' 카테고리의 다른 글
httpconnect 옵션들 (0) | 2017.01.12 |
---|---|
라이브러리 (0) | 2017.01.12 |
firebase 이미지 올리기/다운받기 (0) | 2017.01.10 |
주소에서 bitmap이미지 가져와서, 이미지뷰에 세팅하기 (0) | 2017.01.04 |
스크롤뷰 아래있는게 match parent 안될때 (0) | 2016.12.31 |