美文网首页Kotlin程序员Android知识
62. 同时接收数据和上传的文件

62. 同时接收数据和上传的文件

作者: 厚土火焱 | 来源:发表于2018-03-07 00:44 被阅读106次

    在客户端提交数据的时候,常常会需要同时提交文件。最常见的比如图片文件。那么服务端需要在接收数据的时候,同时处理文件的保存操作。
    本例,服务端采用 go 语言实现,客户端采用 kotlin android端实现。
    在服务端的 main.go 文件中,构建接收客户端访问的监听。还需要一个静态文件路径 upload。

    http.HandleFunc("/platformmanager/updateone/", pManagerUpdateOne2)      //  修改信息
    http.Handle("/upload/", http.StripPrefix("/upload/", http.FileServer(http.Dir("upload"))))          //启动静态上传文件(上传文件)
    http.ListenAndServe(":1695", nil)      //端口监听
    

    这里表示接收数据和文件的逻辑,在 pManagerUpdateOne2 函数中。

    //  修改信息
    func pManagerUpdateOne2(w http.ResponseWriter, r *http.Request) {
        //接收数据
        owner := r.FormValue("Owner")               //所有者
        userId := r.FormValue("UserId")             //用户ID
        password := r.FormValue("Password")         //密码
        trueName := r.FormValue("TrueName")         //姓名
        id := r.FormValue("Id")                     //流水号
        photo := r.FormValue("Photo")               //头像
        sex := r.FormValue("Sex")                   //性别
        isFullPower := r.FormValue("IsFullPower")   //是否全权
        powerString := r.FormValue("PowerString")   //权限串
        creator := r.FormValue("Creator")           //建立者
        clientType := r.FormValue("Type")           //客户端类型
    
    
        //get a ref to the parsed multipart form
        m := r.MultipartForm
    
        //get the *fileheaders
        files := m.File["uploadfile"]
        for i, _ := range files {
            //save file as filename
            filename := string(time.Now().Format("20060102150405")) + strconv.Itoa(time.Now().Nanosecond()) + path.Ext(files[i].Filename)
    
            //for each fileheader, get a handle to the actual file
            file, err := files[i].Open()
            defer file.Close()
            if err != nil {
                http.Error(w, err.Error(), http.StatusInternalServerError)
                return
            }
            //create destination file making sure the path is writeable.
            dst, err := os.Create("./upload/" + filename)
            defer dst.Close()
            if err != nil {
                http.Error(w, err.Error(), http.StatusInternalServerError)
                return
            }
            //copy the uploaded file to the destination file
            if _, err := io.Copy(dst, file); err != nil {
                http.Error(w, err.Error(), http.StatusInternalServerError)
                return
            }
    
            photo = dst.Name()    // 写入保存文件的位置和文件名
        }
    
        fmt.Println(" -> 所有者为[", owner, "]的客户端,修改用户ID[", userId, "] 的信息")
    
        //--构建常规返回值
        back := cdcModel.VisitResultNormal{Owner:owner, Type:clientType, ThisFlag:"", OtherValues:"", VisitResult:false}
        result, _ := json.Marshal(back)
        fmt.Fprintln(w, string(result))     // 返回结果到客户端
    }
    

    photo = dst.Name() 是为了保存服务端文件名的路径。

    kotlin客户端可以是这样实现的。

    val dialog = ProgressDialog.show(this, "正在更新信息...","请稍等...") //弹出ProgressDialog作为登录等待界面
            Thread {
                try {
    
                    //封装post请求数据
                    val file = File(nowChooseImagePath)
                    val fileBody = RequestBody.create(MediaType.parse("application/octet-stream"), file)
                    val requestBody = MultipartBody.Builder()
                            .setType(MultipartBody.FORM)
                            .addFormDataPart("Owner", IDOwner)
                            .addFormDataPart("UserId", UserId)
                            .addFormDataPart("Password", Password)
                            .addFormDataPart("TrueName", TrueName)
                            .addFormDataPart("Creator", Creator)
                            .addFormDataPart("Photo", Photo)
                            .addFormDataPart("PowerString", PowerString)
                            .addFormDataPart("IsFullPower", IsFullPower.toString())
                            .addFormDataPart("Sex", Sex.toString())
                            .addFormDataPart("Id", Id.toString())
                            .addFormDataPart("CreateTime", CreateTime)
                            .addFormDataPart("Type", ClientType)
                            .addFormDataPart("uploadfile", "image.png", fileBody)
                            .build()
                    val client = OkHttpClient()
                    val request = Request.Builder()
                            .url(serverDefaultApi_PlatformManagerUpdateOne())
                            .post(requestBody)
                            .build()
                    val response = client.newCall(request).execute()
                    val responseStr = response.body()?.string()
    
                    //如果从服务器取得了足够的返回信息,则进入管理界面,否则,界面提示登录失败。
                    val jsonObject = JSONObject(responseStr)
                    val mmtemp = Gson().fromJson(jsonObject.toString(), NetVisitResult::class.java)
                    if (mmtemp.VisitResult){
    
                        if (dialog.isShowing()) {  //如果ProgressDialog为打开状态,则关闭
                            dialog.dismiss()
                        }
                        this.finish()
    
                    }else{
                        runOnUiThread {
                            Toast.makeText(this, "修改信息失败! \r\n" + mmtemp.OtherValues, Toast.LENGTH_LONG).show()
                        }
                    }
    
    
                } catch (e: Exception) {
                    runOnUiThread {
                        Toast.makeText(this, "服务器访问失败! \r\n" + e.toString() + "\r\n" + serverDefaultApi_PlatformManagerUpdateOne(), Toast.LENGTH_LONG).show()
                    }
                }
                if (dialog.isShowing()) {  //如果ProgressDialog为打开状态,则关闭
                    dialog.dismiss()
                }
    
            }.start()
    

    .addFormDataPart("uploadfile", "image.png", fileBody) 是文件上传加载数据的语句。
    其他的 .addFormDataPart(xxx, yyy)是上传的数据。
    .url(serverDefaultApi_PlatformManagerUpdateOne()) 是服务器的 api 地址设置语句。
    NetVisitResult::class.java 是数据类,代表数据的结构。表示服务器要按照这个数据类的格式返回信息。

    相关文章

      网友评论

        本文标题:62. 同时接收数据和上传的文件

        本文链接:https://www.haomeiwen.com/subject/fuhdfftx.html