2 回答

TA貢獻1829條經(jīng)驗 獲得超7個贊
這是我在 Go 中遇到的最愚蠢的錯誤之一,所以這希望可以幫助任何遇到這個問題的人。
錯誤源于這里。在此函數(shù)的正上方,您可以看到 的值multipart.File采用case reflect.Struct:switch 情況。如果你傳遞 a string.Builder,它就會采用該case reflect.Ptr:路徑。當我們傳入 a 時,我們可以multipart.File通過將其包裝在結(jié)構(gòu)體中并獲取其指針來強制執(zhí)行此路徑。
wrapper := &struct{ io.ReadSeeker }{file}
_, err = appendBlobURL.AppendBlock(context.Background(), wrapper, azblob.AppendBlobAccessConditions{}, nil)
return err

TA貢獻1784條經(jīng)驗 獲得超8個贊
事實證明,multipart.File當首先使用 檢索不同的表單值r.FormFile("someKey"),然后調(diào)用r.ParseMultipartForm(),然后使用時,確實是 Struct 類型
type Block struct {
File *multipart.File
Name *string
}
func someFunction(r *http.Request, w http.ResonseWriter) error {
r.Body = http.MaxBytesReader(w, r.Body, maxUploadSize)
if err := r.ParseMultipartForm(maxMemory); err != nil {
return err
}
someFunction1(r)
}
func someFunction1(r *http.Request) {
var f multipart.File
someFunction2(r, &f)
name := "block1"
b := Block{
File: &f,
Name: &name,
}
someUploadFunc(&b, "cn")
}
func someFunction2(r *http.Request, *v multipart.File) error {
f := r.FormFile("fileKey")
*v = f
return nil
}
func someUploadFunc(b *Block, cn string) {
curl := bs.NewContainerURL(cn)
burl := curl.NewBlockBlobURL(*b.Name)
lac := azblob.LeaseAccessConditions{}
r, err := burl.StageBlock(ur.Context, "123", *b.File, lac, nil)
...
}
引用指向文件的指針。在這種情況下*v將是類型Struct。但是,通過將處理順序更改為先調(diào)用r.ParseMultipartForm(),然后r.FormFile("someKey")再調(diào)用r.FormFile("fileKey"),*v則類型為multipart.File。
我不太清楚為什么會出現(xiàn)這種情況。看起來是 Golang 問題?您的解決方案確實是一種解決方法,但是如上所述,我能夠通過確保表單處理順序正確來完全防止該問題。
- 2 回答
- 0 關(guān)注
- 177 瀏覽
添加回答
舉報