MultiPart통신 – 이미지 & Body 업로드

3 답변 글타래를 보이고 있습니다
  • 글쓴이
    • 남수
      참가자
      • 글작성 : 13
      • 답글작성 : 2

      이미지를 서버로 전송하는 방법에는 여러 방법이 있을거에요

      제가아는 방법에는

       

      1.

      이미지를 baseString형으로 전환해서 String으로 전송하는 방법

      (로그 찍어보시면… 엄청..길어요..)

      이 방식을 사용한다면 문자열이 엄청 길어서 데이터가 크기때문에 좋지 않은것 같아요

       

      2.

      이미지를 Data로 전환해서 멀티파트로 전송하는 방법

      저는 두 번째 방법을 이제부터 설명할거에요!!

       

      정의를 보면

      multipart/form-data는 파일 업로드가 있는 양식요소에 사용되는 enctype 속성의 값중 하나이고, multipart는 폼데이터가 여러 부분으로 나뉘어 서버로 전송되는 것을 의미

      라고 하네요

       

      간단하게는 ContentType이 multipart/form-data인 타입의 통신이고

      데이터를 심어서 보낼수 있다 라고 생각하면 좋겠네요

       

      멀티파트를 쉽게 사용하는 방법중하나는 Alamofire 라이브러리를 이용하는 건데요

      사용법은 아래와 같아요


      func requestIdentify(userName: String, imgData: Data, completion: @escaping ...) { let header: [String: String] = [ "Content-Type": "multipart/form-data" ] let parameters = [ "userName" : userName ] guard let url = urlComponent?.url else { return } Alamofire.upload(multipartFormData: { multipartFormData in // body를 넣어주는 작업 for (key, value) in parameters { multipartFormData.append("\(value)".data(using: .utf8)!, withName: key, mimeType: "text/plain") } // 이미지를 넣어주는 작업 multipartFormData.append(imgData, withName: "img", fileName: "\(userName).jpg", mimeType: "image/jpg") }, to: url, method: .post, headers: header) { result in ... } }

      위에서 중요한 속성이 3개가있어요

      withname – 서버에서 요구하는 key값

      fileName – 전송될 파일이름

      mimeType – 타입에맞게 image/jpg, image/png, text/plain, 등 타입

       

      이렇게 하면 간단하게 통신할 수 있습니다!!

    • 야곰
      키 마스터
      • 글작성 : 37
      • 답글작성 : 580

      Alamofire를 이용하지 않으면 어떻게 하면 좋을까요?

    • 남수
      참가자
      • 글작성 : 13
      • 답글작성 : 2

      글이 너무 길어질까봐 복잡한 방법보다 쉬운방법을 설명했어요!!

      추가로 제가 아는 부분을 적어보자면


      private func createBody(parameters: [String: String], boundary: String, data: Data, mimeType: String, filename: String) -> Data { let body = NSMutableData() let imgDataKey = "img" let boundaryPrefix = "--\(boundary)\r\n" for (key, value) in parameters { body.appendString(boundaryPrefix) body.appendString("Content-Disposition: form-data; name=\"\(key)\"\r\n\r\n") body.appendString("\(value)\r\n") } body.appendString(boundaryPrefix) body.appendString("Content-Disposition: form-data; name=\"\(imgDataKey)\"; filename=\"\(filename)\"\r\n") body.appendString("Content-Type: \(mimeType)\r\n\r\n") body.append(data) body.appendString("\r\n") body.appendString("—".appending(boundary.appending("—"))) return body as Data }

      이런식으로 직접 구현하고 body부분에 넣어주는 걸로 알고있습니다!!

      • 야곰
        키 마스터
        • 글작성 : 37
        • 답글작성 : 580

        NSMutableData는 Objective-C의 타입이네요. Swift의 Data 타입을 사용해보는 것은 어떨까요? 🙂
        Alamofire를 사용해서 쉽게 해결하는 방법을 아는 것도 좋지만, 초보는 그 라이브러리가 해결해 주는 것을 스스로 직접 해결해 보는 연습을 하는 것이 훨씬 더 많은 공부가 될겁니다.
        보여지는 부분의 많은 것을 구현해보는 것보다, 남들에겐 보이지 않아도 코드를 좀 더 깊게 들여다보는 습관이 나중엔 더 실력있는 프로그래머가 되어있을겁니다. 화이팅!

    • 지태 김
      참가자
      • 글작성 : 1
      • 답글작성 : 1

      withname – 서버에서 요구하는 key값

      fileName – 전송될 파일이름

      mimeType – 타입에맞게 image/jpg, image/png, text/plain, 등 타입

      1. 위에 것들은 필수로 적어주어야하는 것인가요??
      2. 저는 python을 통한 파일 전송 및 다운로드를 해보았고 python으로 서버를 열어둘때는 이미지 혹은 파일들은 files에 open로 requests하면 가능했고 서버에서도 위에 3가지를 받거나 전송하지 않았는데 왜 이런 과정이 들어가나요??  python 예시 ===> response = requests.post(“http://192.168:4444/test_upload”, files = (open한 파일))

      3. 서버도 그럼 alamofire에서 보낸 변수 3개를 따로 받을 준비를 해주어야하나요???

      4. 파일이름이나 type은 이해가가는데 key 값은 무엇을 전달해주어야하나요? 요구하는 key 값이 없으면 어떻게 적어서 보내야하종??

      5. 이미지 전송을 테스트하고싶은데 서버단을 어떤식으로 작성해서 연습해야할지 모르겠네요.

       

      간단하게 GET, HEAD 요청을 할만했는데 이미지 전송이 너무 어렵네요..

3 답변 글타래를 보이고 있습니다
  • 답변은 로그인 후 가능합니다.

logo landscape small

사업자번호 : 743-81-02195
통신판매업 신고번호 : 제 2022-충북청주-1278 호
고객센터 : 카카오톡채널 @yagom