使用 http.Request.Context() 而不是 context.Background() 时,文件不会提交到谷歌云存储

使用 http.request.context() 而不是 context.background() 时,文件不会提交到谷歌云存储

php小编西瓜在介绍Go语言开发中的一个重要细节时指出,使用http.Request.Context()代替context.Background()时,上传文件不会被自动提交到谷歌云存储。这个小细节对于开发者来说非常重要,因为它可能会导致文件上传失败或数据丢失。了解并正确使用这个方法可以避免不必要的问题,确保文件的安全上传和存储。

问题内容

我是新手,我编写了一个简单的宠物项目来将加密文件上传到谷歌云存储。 问题: 在我调用 addentry 函数的http处理程序中,当我传递 r.context() 而不是 context.background() 时,文件不会上传到谷歌存储。在谷歌的控制台中,我可以看到收到的字节,而且我根本没有收到任何错误,但文件本身不存在。

处理程序代码:

//imports, structs skipped func processaddentryrequest(w http.responsewriter, r *http.request) { //validation, getting params from jwt skipped reader, err := r.multipartreader() if err != nil { http.error(w, "multipart/form-data expected, not found", http.statusbadrequest) log.println("could not init multipartreader from request: %w", err) return } gsservice, err := googlestorageservice.new() if err != nil { http.error(w, "internal server error", http.statusinternalservererror) log.println(err) return } bservice, err := backupservice.new( backupservice.withcipher(aes.new()), backupservice.withstorageservice(gsservice)) if err != nil { http.error(w, "internal server error", http.statusinternalservererror) log.println(err) return } var entry *entryrepo.backupentry for { part, err := reader.nextpart() if err == io.eof { break } if err != nil { err = fmt.errorf("error reading: %w", err) log.println(err) http.error(w, "internal server error", http.statusinternalservererror) return } formname := part.formname() if formname == "file" { entry, err = bservice.addentry(r.context(), backupid, part.filename(), part.header.get("content-type"), part) if err != nil { errclose := part.close() err = fmt.errorf("failed to add entry for backup %s: %w; error while closing multipart.part: %w", backupid, err, errclose) log.println(err) http.error(w, "internal server error", http.statusinternalservererror) return } } err = part.close() if err != nil { err = fmt.errorf("failed to close part for backup %s: %w", backupid, err) log.println(err) http.error(w, "internal server error", http.statusinternalservererror) return } } response.entry = *entry jsondata, err := json.marshal(response) if err != nil { http.error(w, "internal server error", http.statusinternalservererror) log.println("failed to marshal json: %wn", err) return } w.writeheader(http.statusok) w.header().set("content-type", "application/json") w.write(jsondata) }登录后复制