반응형
일전에 올렸던 HttpURLConnection을 이용한 Multipart 파일업로드를 샘플입니다.
처음에 파일업로드 하다가 고생을 하였는데 가장 큰 이유는 데이터를 똑바로 넣어주니 404로 처리가 되어서 였습니다.
한참을 하다가 해결을 하였는데 문제는 바로 boundary라는 이녀석인데요. 찾아보지도 않았지만 느낀바로는 Http에서
이녀석까지가 데이터라고 하는 규약이지 않을까 싶네요.
결론적으로는 마지막에 “—boundary—”데이터를 넣어 줘야 한다는 것이죠.
다들 참고하시고 아래 샘플입니다.
rivate void HttpMultiPart(final File file){ new AsyncTask<Void, Void, JSONObject>(){ @Override protected JSONObject doInBackground(Void... voids) { String boundary = "^-----^"; String LINE_FEED = "\r\n"; String charset = "UTF-8"; OutputStream outputStream; PrintWriter writer; JSONObject result = null; try{ URL url = new URL("요청 URL"); HttpURLConnection connection = (HttpURLConnection) url.openConnection(); connection.setRequestProperty("Content-Type", "multipart/form-data;charset=utf-8;boundary=" + boundary); connection.setRequestMethod("POST"); connection.setDoInput(true); connection.setDoOutput(true); connection.setUseCaches(false); connection.setConnectTimeout(15000); outputStream = connection.getOutputStream(); writer = new PrintWriter(new OutputStreamWriter(outputStream, charset), true); /** Body에 데이터를 넣어줘야 할경우 없으면 Pass **/ writer.append("--" + boundary).append(LINE_FEED); writer.append("Content-Disposition: form-data; name=\"데이터 키값\"").append(LINE_FEED); writer.append("Content-Type: text/plain; charset=" + charset).append(LINE_FEED); writer.append(LINE_FEED); writer.append("데이터값").append(LINE_FEED); writer.flush(); /** 파일 데이터를 넣는 부분**/ writer.append("--" + boundary).append(LINE_FEED); writer.append("Content-Disposition: form-data; name=\"file\"; filename=\"" + file.getName() + "\"").append(LINE_FEED); writer.append("Content-Type: " + URLConnection.guessContentTypeFromName(file.getName())).append(LINE_FEED); writer.append("Content-Transfer-Encoding: binary").append(LINE_FEED); writer.append(LINE_FEED); writer.flush(); FileInputStream inputStream = new FileInputStream(file); byte[] buffer = new byte[(int)file.length()]; int bytesRead = -1; while ((bytesRead = inputStream.read(buffer)) != -1) { outputStream.write(buffer, 0, bytesRead); } outputStream.flush(); inputStream.close(); writer.append(LINE_FEED); writer.flush(); writer.append("--" + boundary + "--").append(LINE_FEED); writer.close(); int responseCode = connection.getResponseCode(); if (responseCode == HttpURLConnection.HTTP_OK || responseCode == HttpURLConnection.HTTP_CREATED) { BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream())); String inputLine; StringBuffer response = new StringBuffer(); while ((inputLine = in.readLine()) != null) { response.append(inputLine); } in.close(); try { result = new JSONObject(response.toString()); } catch (JSONException e) { e.printStackTrace(); } } else { BufferedReader in = new BufferedReader(new InputStreamReader(connection.getErrorStream())); String inputLine; StringBuffer response = new StringBuffer(); while ((inputLine = in.readLine()) != null) { response.append(inputLine); } in.close(); result = new JSONObject(response.toString()); } } catch (ConnectException e) { Log.e(TAG, "ConnectException"); e.printStackTrace(); } catch (Exception e){ e.printStackTrace(); } return result; } @Override protected void onPostExecute(JSONObject jsonObject) { super.onPostExecute(jsonObject); } }.execute(); }
반응형
'프로그램 > Android' 카테고리의 다른 글
안드로이드 SNS 카카오톡 로그인 (0) | 2018.11.15 |
---|---|
안드로이드 SNS Facebook 로그인 (0) | 2018.11.12 |
HttpURLConnection Sample(Get, Post) (0) | 2018.08.27 |
이미지사이즈 초과시 대처(Bitmap too large) (0) | 2018.01.11 |
안드로이드 Fabric 설치 (0) | 2017.11.17 |