溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Go語言如何實(shí)現(xiàn)文件上傳

發(fā)布時(shí)間:2022-07-27 10:13:01 來源:億速云 閱讀:252 作者:iii 欄目:開發(fā)技術(shù)

本篇內(nèi)容主要講解“Go語言如何實(shí)現(xiàn)文件上傳”,感興趣的朋友不妨來看看。本文介紹的方法操作簡(jiǎn)單快捷,實(shí)用性強(qiáng)。下面就讓小編來帶大家學(xué)習(xí)“Go語言如何實(shí)現(xiàn)文件上傳”吧!

文件上傳:客戶端把上傳文件轉(zhuǎn)換為二進(jìn)制流后發(fā)送給服務(wù)器,服務(wù)器對(duì)二進(jìn)制流進(jìn)行解析

HTML表單(form)enctype(Encode Type)屬性控制表單在提交數(shù)據(jù)到服務(wù)器時(shí)數(shù)據(jù)的編碼類型.

enctype=”application/x-www-form-urlencoded” 默認(rèn)值,表單數(shù)據(jù)會(huì)被編碼為名稱/值形式

  • enctype=”multipart/form-data” 編碼成消息,每個(gè)控件對(duì)應(yīng)消息的一部分.請(qǐng)求方式必須是post

  • enctype=”text/plain” 純文本形式進(jìn)行編碼的

HTML模版內(nèi)容如下(在項(xiàng)目/view/index.html)

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>文件上傳</title>
</head>
<body>
<form action="upload" enctype="multipart/form-data" method="post">
    用戶名:<input type="text" name="username"/><br/>
    密碼:<input type="file" name="photo"/><br/>
    <input type="submit" value="注冊(cè)"/>
</form>
</body>
</html>

服務(wù)端可以使用FormFIle(“name”)獲取上傳到的文件,官方定義如下

// FormFile returns the first file for the provided form key.
// FormFile calls ParseMultipartForm and ParseForm if necessary.
func (r *Request) FormFile(key string) (multipart.File, *multipart.FileHeader, error) {
    if r.MultipartForm == multipartByReader {
        return nil, nil, errors.New("http: multipart handled by MultipartReader")
    }
    if r.MultipartForm == nil {
        err := r.ParseMultipartForm(defaultMaxMemory)
        if err != nil {
            return nil, nil, err
        }
    }
    if r.MultipartForm != nil && r.MultipartForm.File != nil {
        if fhs := r.MultipartForm.File[key]; len(fhs) > 0 {
            f, err := fhs[0].Open()
            return f, fhs[0], err
        }
    }
    return nil, nil, ErrMissingFile
}

multipart.File是文件對(duì)象

// File is an interface to access the file part of a multipart message.
// Its contents may be either stored in memory or on disk.
// If stored on disk, the File's underlying concrete type will be an *os.File.
type File interface {
    io.Reader
    io.ReaderAt
    io.Seeker
    io.Closer
}

封裝了文件的基本信息

// A FileHeader describes a file part of a multipart request.
type FileHeader struct {
    Filename string                    //文件名
    Header   textproto.MIMEHeader    //MIME信息
    Size     int64                    //文件大小,單位bit

    content []byte                    //文件內(nèi)容,類型[]byte
    tmpfile string                    //臨時(shí)文件
}

服務(wù)器端編寫代碼如下

  • 獲取客戶端傳遞后的文件流,把文件保存到服務(wù)器即可

package main

import (
   "net/http"
   "fmt"
   "html/template"
   "io/ioutil"
)

/*
顯示歡迎頁(yè)upload.html
 */
func welcome(rw http.ResponseWriter, r *http.Request) {
   t, _ := template.ParseFiles("template/html/upload.html")
   t.Execute(rw, nil)
}

/*
文件上傳
 */
func upload(rw http.ResponseWriter, r *http.Request) {
   //獲取普通表單數(shù)據(jù)
   username := r.FormValue("username")
   fmt.Println(username)
   //獲取文件流,第三個(gè)返回值是錯(cuò)誤對(duì)象
   file, header, _ := r.FormFile("photo")
   //讀取文件流為[]byte
   b, _ := ioutil.ReadAll(file)
   //把文件保存到指定位置
   ioutil.WriteFile("D:/new.png", b, 0777)
   //輸出上傳時(shí)文件名
   fmt.Println("上傳文件名:", header.Filename)
}

func main() {
   server := http.Server{Addr: "localhost:8899"}

   http.HandleFunc("/", welcome)
   http.HandleFunc("/upload", upload)

   server.ListenAndServe()
}

到此,相信大家對(duì)“Go語言如何實(shí)現(xiàn)文件上傳”有了更深的了解,不妨來實(shí)際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI