postman 크롬 앱

https://chrome.google.com/webstore/detail/postman/fhbjgbiflinjbdggehcddcbncdddomop?hl=en


사용법

https://stackoverflow.com/questions/16015548/tool-for-sending-multipart-form-data-request


- 멀티 파트 전송도 가능하다. 

파일 및 이미지 전송 Android 에서 JSP Tomcat6 on uBuntu Server


Multipart는 이미지 전송에 특화된 것이다.
requset 개념과 httpPost 객체 개념이 혼합된 것이다.

1. 안드로이드

MultipartEntity라는 객체를 이용하게 된다. 이 객체는 파일 형식으로 데이터를 보내게 된다.

multipart를 사용하면 쉽게 문자열과 파일들을 묶어서 한번에 전송 할 수 있다.
하지만 안드로이드에서 기본적으로 지원하는 HttpClient에서는 Multipart가 지원되지 않는다.
따라서 Multipart를 사용하기 위해서는 Apache HttpComponents에서 받아야 한다.
하지만 최신 버전 4.5.*는 안드로이드 에서 동작하지 않는다.

필자는 4.3.1을 사용 한다.
httpclienthttpcorehttpmine이 세개가 핵심이다.

해당 코드를 사용해서 구현한 App은 NetworkUsage이다.
하지만, Android 2.3.3에서는 정상적으로 동작 하지만, 5.0에서는 오류가 발생 한다.

코드분석

String sdcard = Environment.getExternalStorageDirectory().getPath();                    
// 파일을 서버로 보내는 부분
try {
    HttpClient client = new DefaultHttpClient(); // httpClient 생성
    String url = "서버주소/실행.jsp";
    HttpPost post = new HttpPost(url); // httpPost 생성

    // FileBody 객체를 이용해서 파일을 받아옴
    File glee = new File(sdcard+"/glee.jpg"); // file 객체 생성
    FileBody bin = new FileBody(glee); // FileBody 생성           

    MultipartEntity multipart = new MultipartEntity(HttpMultipartMode.BROWSER_COMPATIBLE);

    multipart.addPart("images", bin); //실제 파일을 multipart에 넣는다.

    post.setEntity(multipart); // Multipart를 post 형식에 담음
    client.execute(post);   // post 형식의 데이터를 서버로 전달

Deplicate된 것을 사용하지 않고 Builder를 이용하는 방법
4.3이상의 httpmine을 사용할경우 Builder를 사용하라고 지시하게 되어 있다.

@Override
protected String doInBackground(String... params) {
    String sdcard = Environment.getExternalStorageDirectory().getPath();

    // 파일을 서버로 보내는 부분
    HttpClient client = new DefaultHttpClient();    
    HttpPost post = new HttpPost(url);

    File glee = new File(sdcard+"/my.db");  
    FileBody bin = new FileBody(glee);  

    MultipartEntityBuilder meb = MultipartEntityBuilder.create();
    meb.setCharset(Charset.forName("UTF-8"));
    meb.setMode(HttpMultipartMode.BROWSER_COMPATIBLE);
    meb.addPart("database", bin);
    HttpEntity entity = meb.build();

    post.setEntity(entity);

    try {
        HttpResponse reponse = client.execute(post);
    } catch (ClientProtocolException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } // post 형식의 데이터를 서버로 전달

    return "SUCCESS";
}

2. Tomcat6 Server (JSP)

클라이언트에서 파일을 서버에 업로드 하기위한 <form>태그는 아래와 같은 형식을 따라야 한다.

<form action="???.jsp" method="post" enctype="multipart/form-data">

method는 반드시 POST 방식
전송할 데이터의 인코딩 방식은 multipart/form-data
GET 방식의 경우 URL에 데이터를 삽입하는 방식으로 255개의 문자만 전송이 가능하므로 파일 전송에는 적합하지 않다.

enctype의 경우에도 Default 값은 urlencoded방식을 사용하게 된다. 하지만 파일의 경우 ASCII파일 뿐만 아니라 이진 파일의 내용도 전송해야 하므로 multipart/form-data방식으로 인코딩 하고 <input>태그에서 type 속성을 file로 지정해서 전송 해야 한다.

파일 업로드 : <input type="file" name="upload"><br>
<input type="submit" value="업로드">

파일업로드 구현시에는 아래의 방법을 많이 사용한다. 가장 쉬운 방법이기 때문이다.
JSP에서 MultipartRequest를 사용하기 위해서는
com.oreilly.servlet을 import 해야 한다.

Download Link
필자는 cos-26Dec2008.zip를 다운 받았다.

설치방법

/var/lib/tomcat6/webapps/ROOT/AppRating

/WebContent/WEB-INF/lib

cos-26Dec2008.zip압축 해제후 cos.jar 파일을 lib위치로 이동 시킨다.

소스코드

<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>
<%@page
    import="com.oreilly.servlet.MultipartRequest,com.oreilly.servlet.multipart.DefaultFileRenamePolicy,java.util.*,java.io.*"%>
<%
    //주의사항. 파일저장 정확한 경로아래에 폴더가 만들어져 있어야한다.
    //폼에서 넘길때 enctype="multipart/form-data"

    //정확한경로의 설정및 확인방법은 다음과같으며...
    String realFolder = ""; //파일경로를 알아보기위한 임시변수를 하나 만들고,
    String saveFolder = "filestorage"; //파일저장 폴더명을 설정한 뒤에...
    String encType = "euc-kr"; //인코딩방식도 함께 설정한 뒤,
    int maxSize = 100 * 1024 * 1024; //파일 최대용량까지 지정해주자.(현재 100메가)
    ServletContext context = getServletContext();
    realFolder = context.getRealPath(saveFolder);
    System.out.println("the realpath is : " + realFolder); // file path

    File dir = new File(realFolder); // 디렉토리 위치 지정
    if (!dir.exists()) { // 디렉토리가 존재하지 않으면
        dir.mkdirs(); // 디렉토리 생성.!
    }
    // print current time
    Date today = new Date();
    System.out.println(today);

    try {
        //멀티파트생성과 동시에 파일은 저장이 되고...
        MultipartRequest multi = null;
        multi = new MultipartRequest(request, realFolder, maxSize,
                encType, new DefaultFileRenamePolicy());
        //이 시점을기해 파일은 이미 저장이 되었다.

        //폼에서 넘어왔던파일 파라메터들을 가져오려면 이렇게.
        Enumeration params = multi.getParameterNames();

        //그리고 가져온 파라메터를 꺼내는 방법...
        while (params.hasMoreElements()) {
            String name = (String) params.nextElement();//파라메터이름을 가져온뒤
            String value = multi.getParameter(name);//이름을 이용해  값을가져온다
            System.out.println(name + " = " + value);
            application.log(name + " = " + value); // logManager
        }

        //이번엔 파일과 관련된 파라메터를 가져온다.
        Enumeration files = multi.getFileNames();

        //이번엔 파일관련 파라메터를 꺼내본다...
        while (files.hasMoreElements()) {
            String name = (String) files.nextElement();//파라메터이름을 가져온뒤
            String filename = multi.getFilesystemName(name);//이름을 이용해 저장된 파일이름을 가져온다.
            String original = multi.getOriginalFileName(name);//이름을이용해 본래 파일이름도 가져온다.
            String type = multi.getContentType(name);//파일타입도 가져올수있다.
            File f = multi.getFile(name);//파일 용량을 알아보기위해서는 이렇게...
            System.out.println("Parameter Name: " + name);
            System.out.println("Real File Name: " + original);
            System.out.println("Saved File Name: " + filename);
            System.out.println("File Type: " + type);
            if (f != null) {
                System.out.println("File Size: " + f.length());
            }

            System.out.println("-------------------------------");

        }
    } catch (IOException ioe) {
        System.out.println(ioe);
    } catch (Exception ex) {
        System.out.println(ex);
    }
%>

결론

Apache HTTPClient 방법은 Android에서 정식으로 지원하는 방법이 아니므로 버전과 환경에 너무 민감하다.
권장하고있는 HttpURLConnection 방법으로 구현하는게 맞는것 같다.
하지만 Stream 처리를 해야하므로 아무래도 좀더 코드양도 많고 귀찮기는 하다.

참고사이트

http://derveljunit.tistory.com/5
http://derveljunit.tistory.com/entry/JSP%EC%97%90%EC%84%9C-DB-%EC%97%B0%EA%B2%B0-%EB%B0%A9%EB%B2%95
http://blog.hansune.com/289
http://yoongi.tistory.com/87


JSP 로그 생성 방법 Eclipse tomcat 6 uBuntu 11.04 (미완성)


application.log()를 사용해도 로그파일이 생성되지 않는다.
이클립스에서는 사용자가 임의로 로그를 생성할 수 있는 라이브러리 2종과 실행환경 옵션이 빠졌기 때문이다.

이클립스에서 실행한 톰켓이 아니라, 로컬에 따로 설치된 독립 톰캣의 경우 로그가 잘 출력 된다.

Consol output을 이용하는 방법

Run Configurations -> Common -> check file -> write path for saving logfile -> check append option

이것과 함께 
system.out.println()을 사용하면 메시지를 consol에 나오게 하며 이것은 자동으로 
위 설정에 의해서 파일에 기록 되어 진다.

사용법

System.out.println("Debugging message");

이클립스로 JSP 개발시 log 메시지 출력하기

1. 사용자 로그 파일을 생성하는데 필요한 라이브러리 다운
라이브러리 이름: Apache log4j
사용된 버전: 1.2.17
다운로드 링크

라이비러리 이름: commons-logging-1.*bin.tar.gz
다운로드 링크

2. 압출풀고 *.jar 파일을 lib 디렉터리로 이동
압축을 해제한다음 각각의 디렉터리에서
commons-logging-1.2.jar과 log4j-1.2.17.jar파일을
현재 이클립스에서 작업하고 있는 디렉터리에서
WEB-INF->lib에다가 두개의 .jar파일을 복사한다.

/다운로드/apache-log4j-1.2/log4j-1.2.jar
/다운로드/commons-logging-1.2/commons-logging-1.2.jar
/이클립스워크스페이스/WEB-INF/lib/log4j-1.2.jar
/이클립스워크스페이스/WEB-INF/lib/commons-logging-1.2.jar

3. 톰켓 실행시 추가한 라이브러리를 사용하도록 옵션을 추가

Run Configurations-> Arguments -> VM argumensts

아래의 설정을 보면 홈디렉토리는 Tomcat6가 설치된 경로로 잡혀있지만,
설정과 관련된 base디렉토리는 Eclipse에서 자체적으로 plugin을 관리하는 임시파일 디렉터리에 저장되는 것을 알 수 있다.

즉, 톰켓 자체는 현재 설치된 버전을 사용하지만, 
설정 값들은 이클립스에서 독자적으로 관리한다는 뜻이 된다.
따라서 톰켓 자체의 설정 값을 변경해도 Eclipse로 톰켓을 실행하면 해당 설정이 전혀 반영이 안되는 것이다.
어쩌면 충돌을 막기위한 당연한 조치일 것이다.

-Dcatalina.base="/var/lib/tomcat6/webapps/ROOT/.metadata/.plugins/org.eclipse.wst.server.core/tmp0" 

-Dcatalina.home="/usr/share/tomcat6" 

-Dwtp.deploy="/var/lib/tomcat6/webapps/ROOT/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/wtpwebapps" 

-Djava.endorsed.dirs="/usr/share/tomcat6/endorsed" 

-Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager 

-Djava.util.logging.config.file="/root/tomcat6Log(Eclipse)/logging.properties"

참고 사이트

http://blog.mezeet.com/2015/01/%EC%9D%B4%ED%81%B4%EB%A6%BD%EC%8A%A4%EB%A1%9C-jsp-%EA%B0%9C%EB%B0%9C%EC%8B%9C-log-%EB%A9%94%EC%8B%9C%EC%A7%80-%EC%B6%9C%EB%A0%A5%ED%95%98%EA%B8%B0/

디버깅 JSP 방법: http://www.tutorialspoint.com/jsp/jsp_debugging.htm


JSON: JavaScript Object Notiation


자료형과 문법

JSON의 기본 자료형은 다음과 같다.

  • 문자
  • 참/거짓
  • 배열: 순서가 있는 리스트이며, []로 나타내며, 요소는 쉼표로 구분
  • 객체: 순서가 없는 이름/값 쌍의 집합이다.
  • null: 빈값을 의미한다.

문자열

항상 큰 따음표(")로 묶어야 하며, 그 안에는 유니코드 문자들이 나열된다.
역슬래시는 제어문자를 표현하기 위해 사용됨.

배열

배열은 대괄호[]로 나타낸다. 배열의 각 요소는 기본 자료형이거나 배열, 객체이다. 각 요소들은 쉼표(,)로 구별된다. 각 요소가 나타나는 순서에 의미가 있다.

장점

JSON은 텍스트로 이루어져 있으므로, 사람과 기계 모두 읽고 쓰기 쉽다.
프로그래밍 언어와 플랫폼에 독립적이므로, 서로 다른 시스템간에 객체를 교환하기에 좋다.
자바스크립트의 문법을 채용했기 때문에, 자바스크립트에서 eval 명령으로 곧바로 사용할 수 있다. 이런 특성은 자바스크립트를 자주 사용하는 웹 환경에서 유리하다. 그러나 실질적으로 eval 명령을 사용하면 외부에서 악성 코드가 유입될 수 있다. 모질라 파이어폭스 3.5, 인터넷 익스플로러 8, 오페라 10.5, 사파리, 구글 크롬 등 대부분의 최신 웹 브라우저는 JSON 전용 파서 기능을 내장하고 있으므로 이런 기능을 사용하는 것이 더 안전할 뿐만 아니라 빠른 방법이다.

참고사이트

위키피디아
JSON


+ Recent posts