파이썬 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 : 일반 파라매터로 전달된 값 가져오기
'개발 > 기타' 카테고리의 다른 글
nullable한 값을 반환하는 집계함수 (0) | 2022.10.14 |
---|---|
우아한 테크코스 4기 백엔드 최종 합격 후기 (0) | 2022.01.22 |
Ubuntu 서버에 Docker로 스프링부트 Jar 배포 (feat Redis) (0) | 2022.01.06 |
[erwin] forward engineering (0) | 2021.07.02 |
aws 우분투 리눅스 tomcat9 서버에 war 파일 배포하기 (0) | 2021.01.22 |
이전 댓글