clientFile, handler, err := r.FormFile("file") // r is *http.Request
var buff bytes.Buffer
fileSize, err := buff.ReadFrom(clientFile)
fmt.Println(fileSize) // this will return you a file size.
func createMockRequest(pathToFile string) *http.Request {
file, err := os.Open(pathToFile)
if err != nil {
return nil
}
defer file.Close()
body := &bytes.Buffer{}
writer := multipart.NewWriter(body)
part, err := writer.CreateFormFile("file", filepath.Base(pathToFile))
if err != nil {
return nil
}
_, _ = io.Copy(part, file)
err = writer.Close()
if err != nil {
return nil
}
// the body is the only important data for creating a new request with the form data attached
req, _ := http.NewRequest("POST", "", body)
req.Header.Set("Content-Type", writer.FormDataContentType())
return req
}
4条答案
按热度按时间kyvafyod1#
要获取文件大小和MIME类型:
样本输出:
6yoyoihd2#
可以从返回的
multipart.FileHeader
中获取文件名和MIME类型。大多数元数据将取决于文件类型,如果是图像,你应该能够使用标准库中的
DecodeConfig
函数,PNG
,JPEG
和GIF
,来获取尺寸(和颜色模型)。还有很多Go语言库可以用于其他类型的文件,它们也有类似的功能。
编辑:
golang-nuts
邮件组有一个很好的例子。7dl7o3gd3#
您可以从
Content-Length
标头中获取有关文件大小的近似信息。不建议这样做,因为此标头可以更改。更好的方法是使用ReadFrom方法:
atmip9wb4#
另一种我发现的非常简单的测试方法是将测试资产放在相对于包的test_data目录中。在我的测试文件中,我通常创建一个帮助器来创建一个 * http.request的示例,这允许我非常容易地在multipart.file上运行表测试,(为了简洁起见,删除了错误检查)。