사진 파일을 서버로 전송하는 예제
MultiPart Request임.
일단.. 검색해보면 많은 포스팅이 있지만..역시나 Java 예제는 많은데 코틀린 예제는 없거나..
코틀린 예제를 검색해서 적용시켰을때 이런 저런 (버젼 문제나 등등..)문제들로 적용이 안되서
이것 저것 섞고 컨버팅 하고 해서 내가 새로만든 ..
Activity와 같은 위치에 MultiPartRequest.kt 파일을 만들어둔다.
그리고 다음과 같은 소스를 복사해서 붙여넣기..
각 기능설명은 소스에 주석으로..
import android.content.res.Resources
import android.graphics.Bitmap
import android.graphics.BitmapFactory
import org.apache.http.*
import org.apache.http.entity.mime.HttpMultipartMode
import org.apache.http.entity.mime.MultipartEntity
import org.apache.http.entity.mime.content.ByteArrayBody
import org.apache.http.entity.mime.content.ContentBody
import org.apache.http.entity.mime.content.FileBody
import org.apache.http.entity.mime.content.StringBody
import java.io.*
import java.lang.Exception
import java.net.HttpURLConnection
import java.net.URL
import java.nio.charset.Charset
import java.util.EnumSet.range
class MultiPartRequest {
//파일을 보내는 함수.. url :서버 주소..보낼 url,fileList :보낼 파일을 리스트로넣어둠. , data:string으로 된 데이터
fun sendFiles(url:String, fileList:List<File>, data:String):String{
var reqEntity=MultipartEntity(HttpMultipartMode.BROWSER_COMPATIBLE)
try{
var stringBody=StringBody(data, Charset.defaultCharset())
reqEntity.addPart("data",stringBody)
for(i in 0..fileList.size-1){
var contentPart:ContentBody= FileBody(fileList[i],fileList[i].name,"image/jpeg","utf-8")
reqEntity.addPart("image",contentPart)
}
}catch (e:Exception){
e.printStackTrace()
}
var response=multipost(url,reqEntity)
return response
} //파일 확장자와 개수가 정해져 있을 떄 파일 보내는 함수
fun sendFiles(url:String, jpg: File, jpeg:File, png:File, data:String):String{
var reqEntity=MultipartEntity(HttpMultipartMode.BROWSER_COMPATIBLE)
try{
var contentPart:ContentBody= FileBody(jpg,jpg.name,"image/jpeg","utf-8")
var contentPart2:ContentBody=FileBody(png,png.name,"image/jpeg","utf-8")
var contentPart3:ContentBody=FileBody(jpeg,jpeg.name,"image/jpeg","utf-8")
var stringBody=StringBody(data, Charset.defaultCharset())
println(stringBody)
reqEntity.addPart("data",stringBody)
reqEntity.addPart("image",contentPart)
reqEntity.addPart("image",contentPart2)
reqEntity.addPart("image",contentPart3)
}catch (e:Exception){
e.printStackTrace()
}
var response=multipost(url,reqEntity)
return response
}
//SendFile 함수 내에서 만들어진 MultiPartEntity를 해당 주소(url)로 보내는 함수
fun multipost(urlString:String, reqEntity:MultipartEntity):String{
var url= URL(urlString)
var conn=url.openConnection() as HttpURLConnection
try{
conn.readTimeout=10000
conn.setConnectTimeout(15000)
conn.requestMethod="POST"
conn.useCaches=false
conn.doInput=true
conn.doOutput=true
conn.setRequestProperty("Connection","Keep-Alive")
conn.addRequestProperty("Content-lengh",reqEntity.contentLength.toString() + "")
conn.addRequestProperty(reqEntity.contentType.name,reqEntity.contentType.value)
var os=conn.outputStream
reqEntity.writeTo(conn.outputStream)
os.close()
conn.connect()
if(conn.responseCode==HttpURLConnection.HTTP_OK){
var res=readStream(conn.inputStream)
conn.disconnect()
return res
}
}catch (e:Exception){
e.printStackTrace()
if(conn!=null)
conn.disconnect()
}
return ""
}
fun readStream(ins:InputStream):String{
var reader: BufferedReader? = null
val builder = StringBuilder()
try {
reader = BufferedReader(InputStreamReader(ins))
var line = ""
var linereader=reader.readLine()
builder.append(linereader)
} catch (e: IOException) {
e.printStackTrace()
} finally {
if (reader != null) {
try {
reader.close()
} catch (e: IOException) {
e.printStackTrace()
}
}
}
return builder.toString()
}
}
실제 Activity에서는.. 다음과 같이 사용함..
Thread(Runnable {
var multipart=MultiPartRequest()
var result=multipart.sendFiles(Const.imageURL,fileList,Data)
if(result!="{\"result\":\"success\"}"){
m_result=false
}else m_result=true
}).start()
imageURL이 서버 주소
fileList가 사진이 담긴 File List
Data가 string으로 된 데이터.
물론.. 이것 역시 사용하는 버젼이나..다른 조건에 따라 .. 안될 수도..
'Kotlin' 카테고리의 다른 글
사진찍기 예제 코틀린 (0) | 2020.01.21 |
---|---|
이전 값 기억하기 (0) | 2020.01.21 |
파일 저장방법 (0) | 2020.01.21 |
안드로이드 권한 주기 (0) | 2020.01.21 |
Kotlin 안드로이드 다이얼로그 사용법 (0) | 2020.01.21 |