- This topic has 4개 답변, 3명 참여, and was last updated 3 years, 1 month 전에 by 지태 김.
-
글쓴이글
-
-
남수참가자
- 글작성 : 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, 등 타입
이렇게 하면 간단하게 통신할 수 있습니다!!
2020-04-14 오전 10:45 #6723 -
남수참가자
- 글작성 : 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부분에 넣어주는 걸로 알고있습니다!!
2020-04-14 오후 3:41 #6785-
야곰키 마스터
- 글작성 : 37
- 답글작성 : 579
NSMutableData
는 Objective-C의 타입이네요. Swift의Data
타입을 사용해보는 것은 어떨까요? 🙂
Alamofire를 사용해서 쉽게 해결하는 방법을 아는 것도 좋지만, 초보는 그 라이브러리가 해결해 주는 것을 스스로 직접 해결해 보는 연습을 하는 것이 훨씬 더 많은 공부가 될겁니다.
보여지는 부분의 많은 것을 구현해보는 것보다, 남들에겐 보이지 않아도 코드를 좀 더 깊게 들여다보는 습관이 나중엔 더 실력있는 프로그래머가 되어있을겁니다. 화이팅!2020-04-14 오후 3:50 #6790
-
지태 김참가자
- 글작성 : 1
- 답글작성 : 1
withname – 서버에서 요구하는 key값
fileName – 전송될 파일이름
mimeType – 타입에맞게 image/jpg, image/png, text/plain, 등 타입
- 위에 것들은 필수로 적어주어야하는 것인가요??
-
저는 python을 통한 파일 전송 및 다운로드를 해보았고 python으로 서버를 열어둘때는 이미지 혹은 파일들은 files에 open로 requests하면 가능했고 서버에서도 위에 3가지를 받거나 전송하지 않았는데 왜 이런 과정이 들어가나요?? python 예시 ===> response = requests.post(“http://192.168:4444/test_upload”, files = (open한 파일))
-
서버도 그럼 alamofire에서 보낸 변수 3개를 따로 받을 준비를 해주어야하나요???
-
파일이름이나 type은 이해가가는데 key 값은 무엇을 전달해주어야하나요? 요구하는 key 값이 없으면 어떻게 적어서 보내야하종??
-
이미지 전송을 테스트하고싶은데 서버단을 어떤식으로 작성해서 연습해야할지 모르겠네요.
간단하게 GET, HEAD 요청을 할만했는데 이미지 전송이 너무 어렵네요..
2021-11-02 오후 4:10 #49549
-
-
글쓴이글
- 답변은 로그인 후 가능합니다.