마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

Servlet을 서버단으로 쓰고 있는데 데이터 찌꺼기가 남은거 같네요..

0 추천

안녕하세요, 안드로이드 개발을 하면서 서버단을 Servlet으로 개발했습니다. 데이터 송수신에서 문제가 없었는데, 파일 업로드 부분에서 문제가 발생했네요.

최초로 파일 업로드한 기기가 '기기A'라고 한다면, 다른 기기에서 무엇을 올리든 텍스트 데이터며 파일이며 '기기A'에서 마지막으로 올라간 텍스트와 파일이 업로드 됩니다.

다른 기능은 전혀 문제가 없습니다. 혹시 왜 그런지 알 수 있을까요?

고수분들 부탁 드려요..!

 

import java.io.BufferedWriter;
import java.io.BufferedInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileWriter;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.Base64;
import java.util.Iterator;
import java.util.List;
import java.util.Date;
import java.text.SimpleDateFormat;

import javax.servlet.ServletException;
import javax.servlet.annotation.MultipartConfig;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.Part;

import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.FileItemFactory;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.apache.commons.io.FileUtils;
import org.apache.commons.io.FilenameUtils;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

@WebServlet("/UpdateManualWithFile")
public class UpdateManualWithFile extends HttpServlet {
	private static final long serialVersionUID = 1L;

	private static final String UPLOAD_DIR = "files/";

	private Connection connection;

	private String session, title, content, type;
	private int id;

	private FileItem uploadFile;
	private File newFile;

	/**
	 * @see HttpServlet#HttpServlet()
	 */
	public UpdateManualWithFile() {
		super();
	}

	@Override
	protected void service(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		// TODO Auto-generated method stub
		super.service(request, response);
	}

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse
	 *      response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		// TODO Auto-generated method stub
		doPost(request, response);
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse
	 *      response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		// TODO Auto-generated method stub
		request.setCharacterEncoding("utf-8");
		response.setCharacterEncoding("utf-8");
		response.setContentType("application/json");

		PrintWriter out = response.getWriter();
		try {
			JSONObject obj = new JSONObject();

			connection = DBBase.connectDB(out);

			String applicationPath = request.getServletContext().getRealPath("");
			String uploadFilePath = applicationPath + UPLOAD_DIR;
			File uploadFolder = new File(uploadFilePath);

			boolean isMultipartContent = ServletFileUpload.isMultipartContent(request);

			if (!uploadFolder.exists()) {
				uploadFolder.mkdirs();
			}
			
			if (connection == null) {
			 	obj.put("response_status_code", -101);
			} else if (!isMultipartContent) {
				obj.put("response_status_code", -102);
			} else {
				FileItemFactory factory = new DiskFileItemFactory();
				ServletFileUpload upload = new ServletFileUpload(factory);
				try {
					List<FileItem> fields = upload.parseRequest(request);
					obj.put("size", fields.size());
					Iterator<FileItem> it = fields.iterator();
					if (!it.hasNext()) {
						obj.put("response_status_code", -102);
					} else {
						while (it.hasNext()) {
							FileItem fileItem = it.next();
							boolean isFormField = fileItem.isFormField();
							if (isFormField) {
								if (fileItem.getFieldName().equals("session")) {
									session = new String(fileItem.getString().getBytes("8859_1"),"utf-8");
									obj.put("session", session);
								} else if (fileItem.getFieldName().equals("title")) {
									title = new String(fileItem.getString().getBytes("8859_1"),"utf-8");
									obj.put("title", title);
								} else if (fileItem.getFieldName().equals("content")) {
									content = new String(fileItem.getString().getBytes("8859_1"),"utf-8");
									obj.put("content", content);
								} else if (fileItem.getFieldName().equals("type")) {
									type = new String(fileItem.getString().getBytes("8859_1"),"utf-8");
									obj.put("type", type);
								} else if (fileItem.getFieldName().equals("id")) {
									id = Integer.valueOf(fileItem.getString()).intValue();
								}
							} else {
								uploadFile = fileItem;
								newFile = new File(request.getServletContext().getRealPath("") + UPLOAD_DIR + File.separator+fileItem.getName());
								uploadFile.write(newFile);
							}
						}
					}
				} catch (FileUploadException e) {
					e.printStackTrace();
					obj.put("error", e.getLocalizedMessage());
				}

				String query = String.format("SELECT emp_id FROM TB_sdmcpsms_employee WHERE session='%s'", session);
				Statement statement = connection.createStatement();
				ResultSet resultSet = statement.executeQuery(query);

				if (resultSet.next()) {
					int empId = resultSet.getInt("emp_id");
					obj.put("is_session_existed", true);

					BufferedWriter bufferedWriter = null;
					FileWriter fileWriter = null;

					try {
						String date = new SimpleDateFormat("yyyy-MM-dd").format(new Date());

						applicationPath = request.getServletContext().getRealPath("");
						uploadFilePath = applicationPath + "logs/";
						uploadFolder = new File(uploadFilePath);
						if (!uploadFolder.exists()) {
							uploadFolder.mkdirs();
						}
						File file = new File(uploadFilePath + date + ".txt");

						if (!file.exists()) {
							file.createNewFile();
						}

						fileWriter = new FileWriter(file.getAbsoluteFile(), true);
						bufferedWriter = new BufferedWriter(fileWriter);

						bufferedWriter.write(new SimpleDateFormat("yyyy-MM-dd hh:mm:ss").format(new Date()) + " - " + " empId: " + empId + ", Modify manual. (params- title: " + title + ", content: " + content + ", type: " + type + ", filename: " + uploadFile.getName() + ")");
						bufferedWriter.newLine();
					} catch (IOException e) {
						e.printStackTrace();
					} finally {
						try {
							if (bufferedWriter != null)
								bufferedWriter.close();
							if (fileWriter != null)
								fileWriter.close();
						} catch (IOException ex) {
							ex.printStackTrace();
						}
					}

					query = "UPDATE TB_sdmcpsms_manual SET title=?, content=?, path=?, moduser=?, moddate=GETDATE() WHERE manual_id=?";
					PreparedStatement preparedStatement = connection.prepareStatement(query);
					preparedStatement.setNString(1, title);
					preparedStatement.setNString(2, content);
					preparedStatement.setNString(3, uploadFile.getName());
					preparedStatement.setInt(4, empId);
					preparedStatement.setInt(5, id);
					preparedStatement.execute();

					obj.put("response_status_code", 1);
				} else {
					obj.put("is_session_existed", false);
				}
			}
			out.print(obj);
		} catch (JSONException e) {
			e.printStackTrace();
		} catch (SQLException e) {
		 	e.printStackTrace();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

 

SteveChoi92 (120 포인트) 님이 2018년 10월 10일 질문
스스에 session 체크하는 부분이 있는데, 소스만 봐서는 이게 정확히 어떤 데이터인지는 모르겠지만, 혹시 다른 디바이스에서도 같은 session 데이터를 올려서 그런게 아닌지 모르겠네요.

답변 달기

· 글에 소스 코드 보기 좋게 넣는 법
· 질문에 대해 추가적인 질문이나 의견이 있으면 답변이 아니라 댓글로 달아주시기 바랍니다.
표시할 이름 (옵션):
개인정보: 당신의 이메일은 이 알림을 보내는데만 사용됩니다.
스팸 차단 검사:
스팸 검사를 다시 받지 않으려면 로그인하거나 혹은 가입 하세요.
...