Browse Source

1.图片上传。

石慧云 4 years ago
parent
commit
6d0fe052b5

+ 20 - 4
app/src/main/java/com/quansu/heifengwuliu/activity/PersonalVerityActivity.kt

@@ -7,18 +7,19 @@ import com.quansu.heifengwuliu.R
 import com.quansu.heifengwuliu.base.MBActivity
 import com.quansu.heifengwuliu.config.MIntentAction
 import com.quansu.heifengwuliu.databinding.ActivityPersonalVerifyBinding
+import com.quansu.heifengwuliu.inte.OnUploadCallback
 import com.quansu.heifengwuliu.repository.PersonalVerifyRepository
+import com.quansu.heifengwuliu.utils.OssUtils
 import com.quansu.heifengwuliu.vmodel.PersonalVerityVModel
 import com.ysnows.base.base.BRepository
 import java.util.*
 
-class PersonalVerityActivity : MBActivity<PersonalVerityVModel, ActivityPersonalVerifyBinding>() {
+class PersonalVerityActivity : MBActivity<PersonalVerityVModel, ActivityPersonalVerifyBinding>(), OnUploadCallback<String> {
 
     override fun binding(): ActivityPersonalVerifyBinding {
         return ActivityPersonalVerifyBinding.inflate(layoutInflater)
     }
 
-
     override fun vmClass(): Class<PersonalVerityVModel> {
         return PersonalVerityVModel::class.java
     }
@@ -45,9 +46,11 @@ class PersonalVerityActivity : MBActivity<PersonalVerityVModel, ActivityPersonal
                 for (path in selectList) {
                     list.add(path.path)
                 }
-               //todo:
-                vm.imgIDMan.value=list[0]
 
+                OssUtils(this)
+                        .setUpLoad("detail", list, this)
+
+                vm.imgIDMan.value=list[0]
 
             }
 
@@ -64,4 +67,17 @@ class PersonalVerityActivity : MBActivity<PersonalVerityVModel, ActivityPersonal
         }
 
     }
+
+    override fun onUploadSuccess(t: String) {
+
+        val ss: Array<String> = t.split(",".toRegex()).toTypedArray()
+        //ss[0]--//不完整路径-接口需要   ss[1]完整路径
+        //todo:
+
+
+    }
+
+    override fun onUploadError(error: String?) {
+        TODO("Not yet implemented")
+    }
 }

+ 10 - 0
app/src/main/java/com/quansu/heifengwuliu/inte/OnCall.kt

@@ -0,0 +1,10 @@
+package com.quansu.heifengwuliu.inte
+
+/**
+ *Created by shihuiyun
+ *on 2020/9/16
+ */
+interface OnCall<D> {
+    fun onCall(d: D)
+
+}

+ 11 - 0
app/src/main/java/com/quansu/heifengwuliu/inte/OnUploadCallback.kt

@@ -0,0 +1,11 @@
+package com.quansu.heifengwuliu.inte
+
+/**
+ *Created by shihuiyun
+ *on 2020/9/16
+ */
+interface OnUploadCallback <T>{
+    fun onUploadSuccess(t: T)
+
+    fun onUploadError(error: String?)
+}

+ 11 - 0
app/src/main/java/com/quansu/heifengwuliu/model/ImageSign.kt

@@ -0,0 +1,11 @@
+package com.quansu.heifengwuliu.model
+
+/**
+ *Created by shihuiyun
+ *on 2020/9/16
+ */
+class ImageSign(var OSSAccessKeyId:String,var policy:String,var Signature:String,
+                var host:String,var expire:Int,var success_action_status:Int,
+                var key:String
+) {
+}

+ 8 - 0
app/src/main/java/com/quansu/heifengwuliu/model/KeyType.kt

@@ -0,0 +1,8 @@
+package com.quansu.heifengwuliu.model
+
+/**
+ *Created by shihuiyun
+ *on 2020/9/16
+ */
+class KeyType(var key:String) {
+}

+ 1 - 0
app/src/main/java/com/quansu/heifengwuliu/utils/ChosePhotoUtils.java

@@ -13,6 +13,7 @@ import com.yanzhenjie.permission.AndPermission;
 import com.yanzhenjie.permission.runtime.Permission;
 
 /**
+ * 拍照/照片
  * Created by shihuiyun
  * on 2020/9/16
  */

+ 114 - 0
app/src/main/java/com/quansu/heifengwuliu/utils/OssUtils.kt

@@ -0,0 +1,114 @@
+package com.quansu.heifengwuliu.utils
+
+import android.text.TextUtils
+import com.quansu.heifengwuliu.R
+import com.quansu.heifengwuliu.inte.OnCall
+import com.quansu.heifengwuliu.inte.OnUploadCallback
+import com.quansu.heifengwuliu.model.ImageSign
+import com.quansu.heifengwuliu.model.KeyType
+import com.quansu.heifengwuliu.utils.net.NetEngine
+import com.ysnows.base.dialog.QMUIProgressDialog
+import com.ysnows.base.view.BView
+import com.zhy.http.okhttp.OkHttpUtils
+import com.zhy.http.okhttp.callback.StringCallback
+import okhttp3.Call
+import java.io.File
+import java.util.*
+import java.util.regex.Pattern
+
+/**
+ *Created by shihuiyun
+ *on 2020/9/16
+ */
+class OssUtils(var bView: BView) {
+
+    /**
+     * 获取sign
+     *
+     * @param onCall
+     */
+    fun getSign(type: String, onCall: OnCall<ImageSign>) {
+
+        bView.repository()!!.lreq(NetEngine.service.getSignedUrl(type))
+                .doOnNext(){
+                    onCall.onCall(it.data()!!)
+                }.subscribe()
+
+    }
+
+    /**
+     * url中是否含有中文
+     *
+     * @param str
+     * @return
+     */
+    fun isContainChinese(str: String?): Boolean {
+        val p = Pattern.compile("[\u4e00-\u9fa5]")
+        val m = p.matcher(str)
+        return m.find()
+    }
+
+
+    var key=""
+    fun setUpLoad(type: String,urls: ArrayList<String>,onUploadListener:OnUploadCallback<String>){
+        key = ""
+        val size = intArrayOf(urls.size)
+        if (size[0] <= 0) return
+        val arr: HashMap<Int, KeyType> = HashMap<Int, KeyType>() //图片上次后的地址
+
+        getSign(type, object : OnCall<ImageSign> {
+            override fun onCall(imageSign: ImageSign) {
+
+                val qmuiProgressDialog = arrayOfNulls<QMUIProgressDialog>(1)
+                qmuiProgressDialog[0] = QMUIProgressDialog()
+                qmuiProgressDialog[0]!!.show(bView!!.context())
+
+                val spe = "android/" + RandomUtils.getRandomOfLetter(1).toString() + "/"
+                for (i in urls.indices) {
+                    val index = urls[i].lastIndexOf("/")
+                    var name: String //文件名字不能含有中文
+                    name = if (isContainChinese(urls[i].substring(index + 1))) {
+                        System.currentTimeMillis().toString() + ".jpg"
+                    } else {
+                        urls[i].substring(index + 1)
+                    }
+                    if (TextUtils.isEmpty(key)) {
+                        key = imageSign.key
+                    }
+                    imageSign.key = key + spe + name
+                    val request: HashMap<String, String>? = RequestModelUtils.toMaps(imageSign)
+                    val fileName = name //文件名
+                    val requestCall = OkHttpUtils.post()
+                            .url(imageSign.host)
+                            .addFile("file", fileName, File(urls[i]))
+                            .params(request)
+                            .id(i)
+                            .build()
+                    val keyType = KeyType(imageSign.key)
+                    arr[i] = keyType
+                    requestCall.execute(object : StringCallback() {
+                        override fun onError(call: Call, e: Exception, id: Int) {
+                            bView.toast(bView.getStr(R.string.upload_pic_fail))
+                            size[0]--
+                            if (size[0] <= 0) {
+                                qmuiProgressDialog[0]!!.dismiss()
+                            }
+                        }
+                        override fun onResponse(response: String, id: Int) {
+                            //地址
+                            onUploadListener.onUploadSuccess(arr[id]!!.key + "," + imageSign.host + "/" + arr[id]!!.key)
+                            size[0]--
+                            if (size[0] <= 0) {
+
+                                qmuiProgressDialog[0]!!.dismiss()
+                            }
+                        }
+                    })
+                }
+            }
+        })
+
+     }
+
+
+    }

+ 83 - 0
app/src/main/java/com/quansu/heifengwuliu/utils/RandomUtils.kt

@@ -0,0 +1,83 @@
+package com.quansu.heifengwuliu.utils
+
+import java.util.*
+
+/**
+ *Created by shihuiyun
+ *on 2020/9/16
+ */
+object RandomUtils {
+    val LETTER_NUMBER = charArrayOf('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k',
+            'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z',
+            '0', '1', '2', '3', '4', '5', '6', '7', '8', '9')
+
+    val LETTER = charArrayOf('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k',
+            'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z')
+
+    val NUMBER = charArrayOf('0', '1', '2', '3', '4', '5', '6', '7', '8', '9')
+
+    /**
+     * 按指定大小在**26个英文字母**中生成随机数。
+     *
+     * @param t 生成的长度,t不能小于1或大于99,否则返回"0"
+     *
+     * @return 你想要的随机数
+     *
+     * @created 2013-5-16 下午02:40:05
+     * @author Belen
+     */
+    fun getRandomOfLetter(t: Int): String? {
+        return get(LETTER, t)
+    }
+
+    /**
+     * 按指定大小在**0-9**数字中生成随机数。
+     *
+     * @param t 生成的长度,t不能小于1或大于99,否则返回"0"
+     *
+     * @return 你想要的随机数
+     *
+     * @created 2013-5-16 下午02:40:05
+     * @author Belen
+     */
+    fun getRandomOfNumber(t: Int): String? {
+        return get(NUMBER, t)
+    }
+
+    /**
+     * 按指定大小在**25个英文以及10个数字**中生成随机数。
+     *
+     * @param t 生成的长度,t不能小于1或大于99,否则返回"0"
+     *
+     * @return 你想要的随机数
+     *
+     * @created 2013-5-16 下午02:40:05
+     * @author Belen
+     */
+    fun getRandomOfLetterAndNumber(t: Int): String? {
+        return get(LETTER_NUMBER, t)
+    }
+
+    /**
+     * 按指定数组生成数据。
+     */
+    private operator fun get(c: CharArray, t: Int): String? {
+        if (t < 1 || t > 99) {
+            return "0"
+        }
+        val maxNum = 36
+        var i: Int // 生成的随机数
+        var count = 0 // 生成的长度
+        val sb = StringBuffer("")
+        val r = Random()
+        while (count < t) {
+            // 生成随机数,取绝对值,防止生成负数,
+            i = Math.abs(r.nextInt(maxNum)) // 生成的数最大为36-1
+            if (i >= 0 && i < c.size) {
+                sb.append(c[i])
+                count++
+            }
+        }
+        return sb.toString()
+    }
+}

+ 55 - 0
app/src/main/java/com/quansu/heifengwuliu/utils/RequestModelUtils.kt

@@ -0,0 +1,55 @@
+package com.quansu.heifengwuliu.utils
+
+import com.githang.statusbar.BuildConfig
+import com.ysnows.base.utils.StringUtil
+import java.lang.reflect.Method
+import java.util.*
+
+/**
+ *Created by shihuiyun
+ *on 2020/9/16
+ */
+class RequestModelUtils {
+    companion object {
+        fun toMaps(o: Any): HashMap<String, String>? {
+            val hashMap = HashMap<String, String>()
+            val fields = o.javaClass.fields
+            for (field in fields) {
+                try {
+                    val value = field[o] ?: continue
+                    if (value is Int && value == -1) {
+                        continue
+                    }
+                    var method: Method? = null
+                    method = try {
+                        o.javaClass.getDeclaredMethod("set" + StringUtil.setterName(field.name), getClazz(value))
+                    } catch (e: NoSuchMethodException) {
+                        if (BuildConfig.DEBUG) e.printStackTrace()
+                        continue
+                    }
+                    if (method != null) {
+                        hashMap[field.name] = value.toString() + ""
+                    }
+                } catch (e: IllegalAccessException) {
+                    e.printStackTrace()
+                }
+            }
+            return hashMap
+        }
+
+        fun getClazz(value: Any?): Class<*>? {
+            if (value is Int) {
+                return Int::class.javaPrimitiveType
+            } else if (value is String) {
+                return String::class.java
+            } else if (value is Float) {
+                return Float::class.javaPrimitiveType
+            } else if (value is Double) {
+                return Double::class.javaPrimitiveType
+            }
+            return null
+        }
+
+
+    }
+}

+ 5 - 0
app/src/main/java/com/quansu/heifengwuliu/utils/net/ApiService.kt

@@ -52,6 +52,11 @@ interface ApiService {
 
 //    ------------
 
+
+    @GET("index/getOssSign")
+    fun getSignedUrl(@Query("type") type: String?): Observable<Response<ImageSign>>
+
+
     /**
      * 获取验证码
      *

+ 3 - 2
app/src/main/res/layout/activity_personal_verify.xml

@@ -24,6 +24,7 @@
             app:layout_constraintStart_toStartOf="parent"
             app:layout_constraintTop_toTopOf="parent" />
 
+<!--     app:url="@{vm.imgIDMan}"    -->
         <com.qmuiteam.qmui.widget.QMUIRadiusImageView
             android:id="@+id/img_id_man"
             android:layout_width="146dp"
@@ -31,11 +32,11 @@
             android:layout_marginTop="@dimen/dp_8"
             android:onClick="@{v->vm.choseImg()}"
             android:scaleType="fitXY"
-            android:src="@drawable/ic_default_image"
             app:layout_constraintStart_toStartOf="@id/tv_title"
             app:layout_constraintTop_toBottomOf="@id/tv_title"
             app:qmui_radius="1dp"
-            app:url="@{vm.imgIDMan}" />
+            android:src="@{vm.imgIDMan,default=@drawable/ic_default_image}"
+            />
 
         <com.qmuiteam.qmui.widget.QMUIRadiusImageView
             android:id="@+id/img_id_emblem"

+ 4 - 0
app/src/main/res/values/strings.xml

@@ -448,6 +448,10 @@ Api 已达到使用限制
     <string name="spot" > · </string >
     <string name="space" >  </string >
     <string name="rice" >米</string >
+    <string name="upload_pic_fail" >上传失败</string >
+    <string name="uploading" >正在上传...</string >
+    <string name="Requesting_please_wait" >正在请求,请稍候</string >
+