英文:
Handle Http Upload Zip file in Golang
问题
我正在使用golang的net/http包通过Postman获取上传的zip文件。
附件文件链接。这不是危险文件,请随意查看。
开发环境
- 本地机器 m1 macbook pro golang 1.17.2 - 没有问题
- 服务器 Docker 镜像 golang:1.17.5-stretch - 出现问题
以下是捕获 post 表单中的 transSourceFile 文件的代码。
func HandleFileReqTest(w http.ResponseWriter, req *http.Request, params map[string]string) err {
if err := req.ParseMultipartForm(32 << 20); err != nil {
return err
}
file, header, err := req.FormFile("transSourceFile")
if err != nil {
return err
}
defer file.Close()
fmt.Println("header.Size:", header.Size)
return nil
}
我也尝试了下面的代码,但没有用。
func HandleFileReqTest(w http.ResponseWriter, req *http.Request, params map[string]string) err {
if err := req.ParseForm(); err != nil {
return err
}
req.ParseMultipartForm(32 << 20)
file, header, err := req.FormFile("transSourceFile")
if err != nil {
return err
}
defer file.Close()
fmt.Println("header.Size:", header.Size)
return nil
}
结果:
本地机器得到的文件大小与原始文件相同。
使用 golang:1.17.5-stretch 的服务器得到的文件大小与原始文件不同。
因此,我无法在服务器上解压文件。有人可以帮忙吗?
英文:
I'm using golang net/http package to retrieve the uploaded zip file via postman.
The attachment file link. It is not dangerous file. Feel free to check out.
Development env
- local machine m1 macbook pro golang 1.17.2 - no issue
- server docker image golang:1.17.5-stretch - got issue.
Code to capture the post form transSourceFile file.
func HandleFileReqTest(w http.ResponseWriter, req *http.Request, params map[string]string) err {
if err := req.ParseMultipartForm(32 << 20); err != nil {
return err
}
file, header, err := req.FormFile("transSourceFile")
if err != nil {
return err
}
defer file.Close()
fmt.Println("header.Size:", header.Size)
return nil
}
I tried below code also no use
func HandleFileReqTest(w http.ResponseWriter, req *http.Request, params map[string]string) err {
if err := req.ParseForm(); err != nil {
return err
}
req.ParseMultipartForm(32 << 20)
file, header, err := req.FormFile("transSourceFile")
if err != nil {
return err
}
defer file.Close()
fmt.Println("header.Size:", header.Size)
return nil
}
Result:
Local machine got the same file size as the origin file.
Server with golang:1.17.5-stretch got the different file size compare to origin file.
As the result on this, i'm unable to unzip the file in the server. Anyone can help?
答案1
得分: 2
你需要将文件从一个位置复制到另一个位置:
f, err := os.Create("some.zip")
defer f.Close()
n, err := io.Copy(f, file)
英文:
You need to copy form file to the actual file:
f, err := os.Create("some.zip")
defer f.Close()
n, err := io.Copy(f, file)
答案2
得分: 0
数据没有完全刷新到文件中。您应该先关闭文件以确保数据完全刷新。
// 创建一个本地文件 filename
dst, err := os.Create("filename.zip")
// 保存文件
fl, err = io.Copy(dst, src)
// 关闭文件
dst.Close()
stat, _ := dst.Stat()
// 现在在刷新文件后检查大小 stat.Size() 或 header.Size。
英文:
Data isn't being flushed to the file completely. You should close the file first to ensure that the data is fully flushed.
// create a local file filename
dst, err := os.Create("filename.zip")
// save it
fl, err = io.Copy(dst, src)
// Close the file
dst.Close()
stat, _ := dst.Stat()
//Now check the size stat.Size() or header.Size after flushing the file.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论