2016-01-29 47 views
0
func fupload(w http.ResponseWriter, r *http.Request) { 
    if r.Method == "POST" { 
     r.ParseForm() 
     company := r.FormValue("company") 
     fmt.Println(company) 
     _, header, _ := r.FormFile("upfile") 
     fmt.Println(header.Filename) 
     return 
    } 
    w.Write([]byte("<html><body>")) 
    w.Write([]byte(fmt.Sprintf("<form method=\"POST\" enctype=\"multipart/form-data\">"))) 
    w.Write([]byte("Enter Company <input type=\"text\" maxlength=\"80\" size=\"80\" name=\"company\" ><br/>")) 
    w.Write([]byte("File to upload: <input type=\"file\" name=\"upfile\" /><br/>")) 
    w.Write([]byte("<input type=\"submit\" value=\"Submit\"/>")) 
    w.Write([]byte("</form>")) 
    w.Write([]byte("</body></html>")) 
    return 
} 

對於輸入類型文本(例如)公司這裏總是返回NULL,當ENCTYPE =「多部分/格式數據」輸入類型文本值形式(ENCTYPE =「多部分/格式數據」)返回null

回答

2

ParseForm只解析查詢參數。從文檔:

ParseForm解析來自URL的原始查詢並更新r.Form。

對於POST或PUT請求,它還以 的形式解析請求主體,並將結果放入r.PostForm和r.Form中。 POST和PUT正文 參數優先於r.Form中的URL查詢字符串值。

如果請求體的大小尚未被 MaxBytesReader限制,則大小限制爲10MB。

ParseMultipartForm自動調用ParseForm。它是冪等的。

要麼使用ParseMultipartForm如果你想處理「的multipart/form-data的」,否則也不打電話,讓FormValue調用所需的內容。

0

是的,你應該使用enctype =「multipart/form-data」。但是,如果您已經使用FormValue(鍵字符串)或FormFile(鍵字符串)方法,則不應使用ParseForm()方法。

Request.FormFile

FormFile返回所提供形式鍵的第一個文件。 FormFile 在必要時調用ParseMultipartForm和ParseForm。

Request.FormValue

FormValue返回該 查詢指定的組分的第一個值。 POST和PUT正文參數優先於URL查詢 字符串值。如果需要 ,FormValue會調用ParseMultipartForm和ParseForm,並忽略這些函數返回的任何錯誤。如果鍵 不存在,FormValue返回空字符串。要訪問同一個鍵的多個 值,請調用ParseForm,然後直接檢查Request.Form 。

<form action="/fupload" method="POST" enctype="multipart/form-data"> 
    <input type="file" name="fileupload"> 
</form> 


file, _, err := req.FormFile("fileupload") 
    switch err { 
    case nil: 
     defer file.Close() 
     fileData, err := ioutil.ReadAll(file) 
     //check err 
    case http.ErrMissingFile: 
     //do something 
    default: 
     //do something 
    } 
相關問題