Jelajahi Sumber

fix: #135 Content-MD5未使用Base64解码

drake 2 tahun lalu
induk
melakukan
3f584a839d

+ 2 - 2
net/src/main/java/com/drake/net/response/ResponseExtension.kt

@@ -86,8 +86,8 @@ fun Response.file(): File? {
         if (file.exists()) {
         if (file.exists()) {
             // MD5校验匹配文件
             // MD5校验匹配文件
             if (request.downloadMd5Verify()) {
             if (request.downloadMd5Verify()) {
-                val md5Header = request.header("Content-MD5")
-                if (file.md5() == md5Header) return file
+                val md5Header = header("Content-MD5")
+                if (md5Header != null && file.md5(true) == md5Header) return file
             }
             }
             // 命名冲突添加序列数字的后缀
             // 命名冲突添加序列数字的后缀
             if (request.downloadConflictRename() && file.name == fileName) {
             if (request.downloadConflictRename() && file.name == fileName) {

+ 8 - 5
net/src/main/java/com/drake/net/utils/FileUtils.kt

@@ -6,18 +6,19 @@ import okhttp3.MediaType
 import okhttp3.MediaType.Companion.toMediaTypeOrNull
 import okhttp3.MediaType.Companion.toMediaTypeOrNull
 import okhttp3.RequestBody
 import okhttp3.RequestBody
 import okio.BufferedSink
 import okio.BufferedSink
+import okio.ByteString.Companion.toByteString
 import okio.source
 import okio.source
 import java.io.File
 import java.io.File
 import java.io.FileInputStream
 import java.io.FileInputStream
 import java.io.IOException
 import java.io.IOException
 import java.security.DigestInputStream
 import java.security.DigestInputStream
 import java.security.MessageDigest
 import java.security.MessageDigest
-import java.util.*
 
 
 /**
 /**
  * 返回文件的MD5值
  * 返回文件的MD5值
+ * @param base64 是否将md5值进行base64编码, 否则将返回hex编码
  */
  */
-fun File.md5(): String? {
+fun File.md5(base64: Boolean = false): String? {
     try {
     try {
         val fileInputStream = FileInputStream(this)
         val fileInputStream = FileInputStream(this)
         val digestInputStream = DigestInputStream(fileInputStream, MessageDigest.getInstance("MD5"))
         val digestInputStream = DigestInputStream(fileInputStream, MessageDigest.getInstance("MD5"))
@@ -26,9 +27,11 @@ fun File.md5(): String? {
             while (true) if (digestInputStream.read(buffer) <= 0) break
             while (true) if (digestInputStream.read(buffer) <= 0) break
         }
         }
         val md5 = digestInputStream.messageDigest.digest()
         val md5 = digestInputStream.messageDigest.digest()
-        val stringBuilder = StringBuilder()
-        for (b in md5) stringBuilder.append(String.format("%02X", b))
-        return stringBuilder.toString().toLowerCase(Locale.ROOT)
+        return if (base64) {
+            md5.toByteString().base64()
+        } else {
+            md5.toByteString().hex()
+        }
     } catch (e: IOException) {
     } catch (e: IOException) {
         Net.debug(e)
         Net.debug(e)
     }
     }