Browse Source

上传File自动识别MediaType

drake 3 years ago
parent
commit
b99237f5c2

+ 4 - 4
net/src/main/java/com/drake/net/request/BodyRequest.kt

@@ -21,8 +21,8 @@ package com.drake.net.request
 import com.drake.net.interfaces.ProgressListener
 import com.drake.net.tag.NetLabel
 import com.drake.net.utils.lazyField
+import com.drake.net.utils.toRequestBody
 import okhttp3.*
-import okhttp3.RequestBody.Companion.asRequestBody
 import okhttp3.RequestBody.Companion.toRequestBody
 import okio.ByteString
 import org.json.JSONArray
@@ -65,17 +65,17 @@ open class BodyRequest : BaseRequest() {
     }
 
     fun param(name: String, value: File?) {
-        partBody.addFormDataPart(name, null, value?.asRequestBody() ?: return)
+        partBody.addFormDataPart(name, null, value?.toRequestBody() ?: return)
     }
 
     fun param(name: String, values: List<File?>?) {
         values?.forEach { value ->
-            value?.asRequestBody()?.let { partBody.addFormDataPart(name, null, it) }
+            value?.toRequestBody()?.let { partBody.addFormDataPart(name, null, it) }
         }
     }
 
     fun param(name: String, fileName: String?, value: File?) {
-        partBody.addFormDataPart(name, fileName, value?.asRequestBody() ?: return)
+        partBody.addFormDataPart(name, fileName, value?.toRequestBody() ?: return)
     }
 
     fun param(body: RequestBody, header: Headers? = null) {

+ 0 - 0
net/src/main/java/com/drake/net/request/MediaType.kt → net/src/main/java/com/drake/net/request/MediaConst.kt


+ 32 - 2
net/src/main/java/com/drake/net/utils/FileUtils.kt

@@ -1,5 +1,12 @@
 package com.drake.net.utils
 
+import android.webkit.MimeTypeMap
+import okhttp3.MediaType
+import okhttp3.MediaType.Companion.toMediaTypeOrNull
+import okhttp3.RequestBody
+import okhttp3.RequestBody.Companion.asRequestBody
+import okio.BufferedSink
+import okio.source
 import java.io.File
 import java.io.FileInputStream
 import java.io.IOException
@@ -10,8 +17,7 @@ import java.util.*
 /**
  * 返回文件的MD5值
  */
-fun File?.md5(): String? {
-    this ?: return null
+fun File.md5(): String? {
     try {
         val fileInputStream = FileInputStream(this)
         val digestInputStream = DigestInputStream(fileInputStream, MessageDigest.getInstance("MD5"))
@@ -27,4 +33,28 @@ fun File?.md5(): String? {
         e.printStackTrace()
     }
     return null
+}
+
+/**
+ * 返回文件的MediaType值, 如果不存在返回null
+ */
+fun File.mediaType(): MediaType? {
+    val fileExtension = MimeTypeMap.getFileExtensionFromUrl(absolutePath)
+    return MimeTypeMap.getSingleton().getMimeTypeFromExtension(fileExtension)?.toMediaTypeOrNull()
+}
+
+/**
+ * 创建File的RequestBody
+ * @param contentType 如果为null则通过判断扩展名来生成MediaType
+ */
+fun File.toRequestBody(contentType: MediaType? = null): RequestBody {
+    return object : RequestBody() {
+        override fun contentType() = contentType ?: mediaType()
+
+        override fun contentLength() = length()
+
+        override fun writeTo(sink: BufferedSink) {
+            source().use { source -> sink.writeAll(source) }
+        }
+    }
 }