<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                擴展:分塊上傳 === ### 初始化分塊上傳 ~~~ // 初始化分塊上傳 func InitialMultipartUploadHandler(w http.ResponseWriter,r *http.Request,p httprouter.Params) { // 1.解析用戶請求信息 r.ParseForm() username := r.PostForm.Get("username") filehash := r.PostForm.Get("filehash") filesize, err := strconv.ParseInt(r.PostForm.Get("filesize"), 10, 64) if err != nil { response.RespMsg(w,defs.ErrorBadRequest) return } // 2.獲得redis的連接 redisConn := redis.RedisConn.Get() defer redisConn.Close() // 3.生成分塊上傳的初始化信息 info := &MultipartUploadInfo{ FileHash:filehash, FileSize:filesize, UploadID:username + utils.TimeGetNowTimeStr(), ChunkSize:5*1024*1024,// 5MD ChunkCount:int(math.Ceil(float64(filesize)/(5*1024*1024))),// 轉float64除法在向上取整 } // 4.將初始化信息寫入到redis緩存 redisConn.Do("set","name","age") redisConn.Do("HSET","MP_" + info.UploadID,"chunkcount",info.ChunkCount) redisConn.Do("HSET","MP_" + info.UploadID,"filehash",info.FileHash) redisConn.Do("HSET","MP_" + info.UploadID,"filesize",info.FileSize) redisConn.Do("HSET","MP_" + info.UploadID,"chunksize",info.ChunkSize) // 5.將相應信息初始化數據返回到客戶端 response.RespInputData(w,200,info) } ~~~ ### 上傳文件分塊 ~~~ // 上傳文件分塊 func UploadPartHandler(w http.ResponseWriter,r *http.Request,p httprouter.Params) { // 1.解析用戶請求參數 r.ParseForm() //username := r.Form.Get("username") uploadId := r.Form.Get("uploadid") chunkIndex := r.Form.Get("index") // 2.獲得redis連接池中的一個連接 redisConn := redis.RedisConn.Get() defer redisConn.Close() // 3.獲得文件句柄,用于存儲分塊內容 path := "data/" + uploadId err := utils.DirPing(path) if err != nil { response.RespMsg(w,defs.ErrorBadServer) return } file := path + "/" + chunkIndex openFile, err := os.OpenFile(file, os.O_CREATE|os.O_WRONLY|os.O_TRUNC, 00666) if err != nil { response.RespMsg(w,defs.ErrorBadServer) return } defer openFile.Close() data, _, err := r.FormFile("file") defer data.Close() if err != nil { response.RespMsg(w,defs.ErrorBadRequest) return } reader := bufio.NewReader(data) writer := bufio.NewWriter(openFile) buf := make([]byte, 1024*1024) // 1M buf for { _, err := reader.Read(buf) if err == io.EOF { break }else if err != nil { response.RespMsg(w,defs.ErrorBadRequest) return }else{ writer.Write(buf) } } writer.Flush() // 4.更新redis緩存狀態 redisConn.Do("HSET","MP_"+uploadId,"chkidx_"+chunkIndex,1) // 5.返回處理結果到客戶端 response.RespInputMsg(w,200,"ok") // 不足之處,客戶端上傳需要攜帶當前分塊的hash,服務端校驗確保文件的完整性 } ~~~ ### 通知上傳合并接口 ~~~ // 通知上傳合并接口 func CompleteUploadHandler(w http.ResponseWriter,r *http.Request,p httprouter.Params) { // 1.解析請求參數 r.ParseForm() upid := r.Form.Get("uploadid") username := r.Form.Get("username") filehash := r.Form.Get("filehash") filesize := r.Form.Get("filesize") filename := r.Form.Get("filename") // 2.獲得redis連接池的一個連接 redisConn := redis.RedisConn.Get() defer redisConn.Close() // 3.通過uploadid查詢redis判斷是否所有分塊上傳完成 values, e := redis2.Values(redisConn.Do("HGETALL", "MP_"+upid)) if e != nil { response.RespMsg(w,defs.ErrorBadRequest) return } totalCount := 0 // 上傳完成數量 chunkCount := 0 // 總數量 for i:=0;i<len(values);i+=2{ k := string(values[i].([]byte)) v := string(values[i+1].([]byte)) if k == "chunkcount" { totalCount,_=strconv.Atoi(v) }else if strings.HasPrefix(k,"chkidx_") && v == "1" { chunkCount += 1 } } // 不等就是上傳沒有完成 if totalCount != chunkCount { response.RespMsg(w,defs.ErrorBadRequest) return } // 4.合并分塊 // 5.更新唯一文件表,更新用戶文件表 // 6.相應處理結果 } ~~~
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看