我是GoLang语言的新手,我想为文件上传创建REST API WebServer ......
所以我被主要功能(文件上传)卡在我的服务器的POST请求中......
我有这行来调用上传功能
router.POST("/upload", UploadFile)
这是我的上传功能:
func UploadFile( w http.ResponseWriter, r *http.Request, _ httprouter.Params ) {
io.WriteString(w, "Upload files\n")
postFile( r.Form.Get("file"), "/uploads" )
}
func postFile(filename string, targetUrl string) error {
bodyBuf := &bytes.Buffer{}
bodyWriter := multipart.NewWriter(bodyBuf)
// this step is very important
fileWriter, err := bodyWriter.CreateFormFile("file", filename)
if err != nil {
fmt.Println("error writing to buffer")
return err
}
// open file handle
fh, err := os.Open(filename)
if err != nil {
fmt.Println("error opening file")
return err
}
//iocopy
_, err = io.Copy(fileWriter, fh)
if err != nil {
panic(err)
}
bodyWriter.FormDataContentType()
bodyWriter.Close()
return err
}
但我无法在/upload/
目录中看到任何已上传的文件......
那么我做错了什么?
P.S我得到第二个错误=> error opening file
,所以我认为文件上传或从UploadFile
函数获取文件有问题,对吗?如果是,那么我可以如何从此功能中获取或获取文件到postFile
功能?
答案 0 :(得分:3)
12 & 8 // true (01010 & 01000 => 01000)
15 & 8 // true (01111 & 01000 => 01000)
7 & 8 // false (00111 & 01000 => 00000)
17 & 8 // false (10001 & 01000 => 00000)
生成多部分消息,这不是您想要用来从客户端接收文件并将其保存到磁盘的内容。
假设您要从客户端上传文件,例如使用multipart.Writer
的浏览器,您应该使用FormFile而不是Content-Type: application/x-www-form-urlencoded
,它会返回r.Form.Get
值,其中包含客户端发送的文件内容以及您可以使用的文件内容使用*multipart.File
或不是。
答案 1 :(得分:2)
os.Open
将打开一个文件,因为该文件不存在,您将收到错误消息。
使用os.Create
代替它将创建一个新文件并将其打开。 (参考:https://golang.org/pkg/os/#Open)
func打开
func Open(name string) (*File, error)
打开打开指定的文件 读。如果成功,则可以使用返回文件上的方法 读;关联的文件描述符具有模式O_RDONLY。如果有 错误,它将是* PathError类型。
func创建
func Create(name string) (*File, error)
Create使用模式0666(在umask之前)创建命名文件, 如果它已经存在则截断它。如果成功,方法就可以了 返回文件可用于I / O;关联的文件描述符有 模式O_RDWR。如果有错误,则其类型为* PathError。
修改强>
以新的处理程序为例: 并且还使用了如下所述的OpenFile:GoLang send file via POST request
func Upload(w http.ResponseWriter, r *http.Request) {
io.WriteString(w, "Upload files\n")
file, handler, err := r.FormFile("file")
if err != nil {
panic(err) //dont do this
}
defer file.Close()
// copy example
f, err := os.OpenFile(handler.Filename, os.O_WRONLY|os.O_CREATE, 0666)
if err != nil {
panic(err) //please dont
}
defer f.Close()
io.Copy(f, file)
}