2016-03-06 229 views
0

在我的使用案例中,我试图上传一个文件到golang的服务器。我有以下的HTML代码,golang文件上传失败

<div class="form-input upload-file" enctype="multipart/form-data" > 
    <input type="file"name="file" id="file" /> 
    <input type="hidden"name="token" value="{{.}}" /> 
    <a href="/uploadfile/" data-toggle="tooltip" title="upload"> 
     <input type="button upload-video" class="btn btn-primary btn-filled btn-xs" value="upload" /> 
    </a> 
</div> 

而在服务器端,

func uploadHandler(w http.ResponseWriter, r *http.Request) { 
    // the FormFile function takes in the POST input id file 
    file, header, err := r.FormFile("file") 
    if err != nil { 
     fmt.Fprintln(w, err) 
     return 
    } 
    defer file.Close() 

    out, err := os.Create("/tmp/uploadedfile") 
    if err != nil { 
     fmt.Fprintf(w, "Unable to create the file for writing. Check your write access privilege") 
     return 
    } 
    defer out.Close() 

    // write the content from POST to the file 
    _, err = io.Copy(out, file) 
    if err != nil { 
     fmt.Fprintln(w, err) 
    } 

    fmt.Fprintf(w, "File uploaded successfully : ") 
    fmt.Fprintf(w, header.Filename) 
} 

当我尝试上传的文件,我得到在服务器端request Content-Type isn't multipart/form-data错误。

任何人都可以帮助我吗?

回答

1

说实话,我不知道你怎么会得到错误,因为你的HTML不是形式。但我认为你得到的错误,因为默认形式发送为GET请求,而multipart/form-data应通过POST发送。这是应该工作的最小形式的例子。

<form action="/uploadfile/" enctype="multipart/form-data" method="post"> 
    <input type="file" name="file" id="file" /> 
    <input type="hidden"name="token" value="{{.}}" /> 
    <input type="submit" value="upload" /> 
</form> 
+0

谢谢。我试图在另一种形式中使用这个。所以我尝试了这种方式。有没有任何工作可以在另一个表单中使用它?这将是非常有帮助 – Dany

+0

@DineshAppavoo窗体内部窗体? –

+0

看起来不可能[nest-forms](http://stackoverflow.com/questions/379610/can-you-nest-html-forms)。我试过了,原始形式正在崩溃。有没有解决方法? – Dany

1

问题是您必须包含包含内容类型的标头。

req.Header.Add("Content-Type", writer.FormDataContentType()) 

这包含在mime/multipart包中。

对于一个工作示例,请检查this博客文章。

+0

他并非试图从Go应用发送表单。他无法在Go应用中获取HTML表单数据。 –

+0

是的,这就是他收到上述错误的原因。 –

+0

他的Go代码完全适用于正确的HTML表单。而你的链接是关于从Go发送数据到远程服务。 –