服务器
1.从表单获取数据 r.FormFile("name") <input type="file" name="file">
2.读取表单数据至内存中data, err := ioutil.ReadAll(file) (ioutil包流式读写) (php是$_FILES)
3.获取get请求的参数 fn := p.ByName("vid-id") html中:action="http://127.0.0.1:9000/upload/2"
4.写入到服务器硬盘中 err = ioutil.WriteFile(VIDEO_DIR + fn, data, 0777) (PHP是move_uploadfile_to)
5.返回结果给客户端w.WriteHeader(http.StatusCreated) io.WriteString(w, "Uploaded successfully")
func uploadHandler(w http.ResponseWriter, r *http.Request, p httprouter.Params) {
// 能够读取到的最大的缓冲区内容
r.Body = http.MaxBytesReader(w, r.Body, MAX_UPLOAD_SIZE)
// ParseMultipartForm表单的最大
if err := r.ParseMultipartForm(MAX_UPLOAD_SIZE); err != nil {
sendErrorResponse(w, http.StatusBadRequest, "File is too big")
return
}
// 从表单拿到文件
// file对应表单的name
// 第二个是类型
file, _, err := r.FormFile("file")
if err != nil {
log.Printf("Error when try to get file: %v", err)
sendErrorResponse(w, http.StatusInternalServerError, "Internal Error")
return
}
// 读取到我们数据里面
data, err := ioutil.ReadAll(file)
if err != nil {
log.Printf("Read file error: %v", err)
sendErrorResponse(w, http.StatusInternalServerError, "Internal Error")
}
// 获取文件名
fn := p.ByName("vid-id")
// 保存文件
err = ioutil.WriteFile(VIDEO_DIR + fn, data, 0777)
if err != nil {
log.Printf("Write file error: %v", err)
sendErrorResponse(w, http.StatusInternalServerError, "Internal Error")
return
}
// 反馈code与信息
w.WriteHeader(http.StatusCreated)
io.WriteString(w, "Uploaded successfully")
}
表单
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<title>ä¸Šä¼ </title>
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" type="text/css" media="screen" href="main.css" />
<script src="main.js"></script>
</head>
<body>
<form enctype="multipart/form-data" action="http://127.0.0.1:9000/upload/2" method="post">
{{/*1.file input*/}}
<input type="file" name="file">
{{/*2.submit button*/}}
<input type="submit" value="uplad file">
</form>
</body>
</html>