본문 바로가기
개발/기타

[Maven/JSP/파이썬] 파이썬 Client에서 JSP Server로의 파일 데이터 전송(feat. MultipartRequest)

by hamcheeseburger 2021. 3. 27.

파이썬 Client 환경에서 JSP Server로의 이미지나 txt파일이나 이미지 데이터를 전송하는 방법에 대하여 작성해보려 한다.

 

1. 통신구조

필자는 Http 프로토콜을 사용하여 파일 데이터를 전송했다.

서버단에서는 MultipartRequest 객체로 전송된 데이터를 처리 할 생각이다. 

2. Python Client 에서의 데이터 전송

전송할 파일 : 텍스트파일 1개, n개의 이미지파일

import requests

# 전송할 url 주소
url = "http://...."

# open함수를 통해 전송할 파일 가져오기
log_file = open(self.logInfo.file_path, 'r', encoding="utf-8")

# file
upload = [
  ("log_file": log_file)
]

# 이미지 list 가져오기
path_dir = './CaptureImage/'
image_list = os.listdir(path_dir)

# 이미지 파일 upload 배열에 추가
image_files = []
i = 1
for image_name in image_list:
   image_file = open(path_dir + image_name, "rb")
   image_files.append(image_file)
   obj = ("image" + str(i), image_file)
   upload.append(obj)
   i += 1
   
# Prameter
info = {
  "log_created": "210327"
}

try:
	# 파일은 files 키워드로, 다른 데이터는 data 키워드로 전송하면 된다
	 response = requests.post(url, files=upload, data=info, verify=False)
except:
   print("Connection Error")
   
# open한 파일들 close
for image_f in image_files:
    image_f.close()
    
log_file.close()

Line 7 : 텍스트 파일 읽기

Line 10~12 : 텍스트 파일과 keyword를 tuple형태로 list안에 넣는다.

Line 15~16 : 가져올 이미지폴더의 경로를 지정하고 이미지 list를 가져온다.

Line 19~26 : 이미지들을 읽어 tuple형태로 upload list에 append하는 코드이다. i 변수는 이미지별 keyword를 구분하기 위하여 존재한다. (image1, image2의 keyword를 만들기 위함)

Line 29~31 : 일반 parameter로 넘길 정보를 dict 형식으로 만들기

Line 35 : requests를 사용하여 파일에 해당하는 데이터는 "files" 키워드로, 일반 파라매터에 해당하는 데이터는 "data"키워드로 전달함

Line 40~43: open 했던 파일들을 close해주는 과정

3. Jsp Server 에서의 데이터 처리

public class GetClientInfoController implements Controller {

	@Override
	public String execute(HttpServletRequest request, HttpServletResponse response) throws Exception {
		//	log file 받아서 서버에 저장
		String path = "/home/ubuntu/log";
		
		int maxFileSize = 1024 * 1024 * 2;
		
		//	전달 받은 파일 저장
		MultipartRequest multipartRequest = new MultipartRequest(request, path, maxFileSize, "utf-8", new DefaultFileRenamePolicy());
		
        	// 변수 초기화
		String logFileName = "";
		ArrayList<String> imageFilesName = new ArrayList<String>();
		
		//	전달 받은 파일처리
		Enumeration fileNames = multipartRequest.getFileNames();
		while(fileNames.hasMoreElements()) {
			String key = (String) fileNames.nextElement();
			String fileName = multipartRequest.getFile(key).getName();
	
			if(key.equals("log_file")){ // 전달받은 파일이 로그파일일 때
				logFileName = fileName;
			}else { // 전달받은 파일이 이미지 파일일 때
				imageFilesName.add(fileName);
			}
		}
    
		//	Parameter 가져오기    
    		String date = multipartRequest.getParameter("log_created");
            
        // 이하생략..
    	}
}

Line 6 : 전달받은 파일들을 저장할 경로 지정

Line 8 : 저장할 파일들의 최대 사이즈 지정

Line 11 : HttpServletRequest를 MultipartRequest에 전달하고 파일들을 해당 경로에 저장하는 상황. 이 코드가 실행되면 지정한 경로에 파일들이 저장된 것을 확인할 수 있다.

Line 18 : multipartRequest 객체를 통해 전달받은 파일의 keywords 를 받아옴 (python client쪽에서 tuple형태로 지정했던 keyword들)

Line 21 : keyword를 통해 파일에 접근하고 실제 파일명을 알아내기

Line 23~27 : keyword로 전달받은 파일을 구분하고 각각의 실제 파일명을 정리하고 있는 코드이다

Line 31 : 일반 파라매터로 전달된 값 가져오기

이전 댓글