国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

三分鐘用Golang搭建一個(gè)HTTP文件上傳下載服務(wù)器

這篇具有很好參考價(jià)值的文章主要介紹了三分鐘用Golang搭建一個(gè)HTTP文件上傳下載服務(wù)器。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

背景

簡(jiǎn)單需要一個(gè)文件服務(wù)器來傳遞數(shù)據(jù),只要兩個(gè)功能,一個(gè)上傳接口,一個(gè)下載接口。

選用go http模塊實(shí)現(xiàn),比nginx、ftp等更方便快捷。

需求整理

  • 上傳接口"/v1/file_upload/"
  • 上傳接口增加簡(jiǎn)單BasicAuth鑒權(quán)
  • 上傳成功返回下載URL
    json格式返回

電梯直達(dá)

只想文件上傳服務(wù)器測(cè)試接口,以下電梯直達(dá)即可
CSDN 5積分下載
白嫖

測(cè)試效果

三分鐘用Golang搭建一個(gè)HTTP文件上傳下載服務(wù)器三分鐘用Golang搭建一個(gè)HTTP文件上傳下載服務(wù)器

GO代碼實(shí)現(xiàn)

package main

import (
	"bytes"
	"encoding/base64"
	"encoding/json"
	"flag"
	"fmt"
	"io"
	"log"
	"net/http"
	"os"
	"path/filepath"
	"strings"
)

type ViewFunc func(http.ResponseWriter, *http.Request)

func http_resp(code int, msg string, w http.ResponseWriter) {
	var Result map[string]interface{}
	Result = make(map[string]interface{})

	Result["code"] = code
	Result["msg"] = msg

	data, err := json.Marshal(Result)
	if err != nil {
		log.Printf("%v\n", err)
	}

	w.Write([]byte(string(data)))
}

func upload(w http.ResponseWriter, r *http.Request) {
	if r.Method == "GET" {
		t, _ := template.ParseFiles("upload.html")
		t.Execute(w, nil)
		return
	}
	
	contentType := r.Header.Get("content-type")
	contentLen := r.ContentLength

	if !strings.Contains(contentType, "multipart/form-data") {
		http_resp(-1001, "The content-type must be multipart/form-data", w)
		return
	}
	//限制最大文件大小
	if contentLen >= 50*1024*1024 {
		http_resp(-1002, "Failed to large,limit 50MB", w)
		return
	}

	err := r.ParseMultipartForm(50 * 1024 * 1024)
	if err != nil {
		http_resp(-1003, "Failed to ParseMultipartForm", w)
		return
	}

	if len(r.MultipartForm.File) == 0 {
		http_resp(-1004, "File is NULL", w)
		return
	}

	var Result map[string]interface{}
	Result = make(map[string]interface{})

	Result["code"] = 0
	DownLoadUrl := "http://192.168.10.9:8080/"

	FileCount := 0
	for _, headers := range r.MultipartForm.File {
		for _, header := range headers {
			log.Printf("recv file: %s\n", header.Filename)

			filePath := filepath.Join("./upload", header.Filename)
			dstFile, err := os.OpenFile(filePath, os.O_WRONLY|os.O_CREATE, 0666)
			if err != nil {
				log.Printf("Create file %s error: %s\n", filePath, err)
				return
			}
			srcFile, err := header.Open()
			if err != nil {
				log.Printf("Open header failed: %s\n", err)
			}
			_, err = io.Copy(dstFile, srcFile)
			if err != nil {
				log.Printf("Write file %s error: %s\n", filePath, err)
			}
			_, _ = srcFile.Close(), dstFile.Close()
			FileCount++
			name := fmt.Sprintf("file%d_url", FileCount)
			Result[name] = (DownLoadUrl + header.Filename)
		}
	}
	data, err := json.Marshal(Result)
	if err != nil {
		log.Printf("%v \n", err)
	}
	w.Write([]byte(string(data)))
}

func BasicAuth(f ViewFunc, user, passwd []byte) ViewFunc {
	return func(w http.ResponseWriter, r *http.Request) {
		basicAuthPrefix := "Basic "

		// 獲取 request header
		auth := r.Header.Get("Authorization")
		// 如果是 http basic auth
		if strings.HasPrefix(auth, basicAuthPrefix) {
			// 解碼認(rèn)證信息
			payload, err := base64.StdEncoding.DecodeString(
				auth[len(basicAuthPrefix):],
			)
			if err == nil {
				pair := bytes.SplitN(payload, []byte(":"), 2)
				if len(pair) == 2 && bytes.Equal(pair[0], user) &&
					bytes.Equal(pair[1], passwd) {
					// 執(zhí)行被裝飾的函數(shù)
					f(w, r)
					return
				}
			}
		}

		// 認(rèn)證失敗,提示 401 Unauthorized
		// Restricted 可以改成其他的值
		w.Header().Set("WWW-Authenticate", `Basic realm="Restricted"`)
		// 401 狀態(tài)碼
		w.WriteHeader(http.StatusUnauthorized)
	}
}

func main() {
	addr := flag.String("addr", "0.0.0.0:8080", "服務(wù)綁定地址端口")
	user := flag.String("user", "", "http認(rèn)證用戶名(如果用戶名為空,則不需要認(rèn)證)")
	psw := flag.String("psw", "", "http認(rèn)證密碼")
	root := flag.String("root", "./upload/", "文件服務(wù)根目錄")
	flag.Parse()

	os.Mkdir(*root, 0777)

	http_user := []byte(*user)
	http_psw := []byte(*psw)

	log.Printf("http server listen on %v \n", *addr)

	if *user != "" {
		http.HandleFunc("/v1/file_upload", BasicAuth(upload, http_user, http_psw))
	} else {
		http.HandleFunc("/v1/file_upload", upload)
	}

	http.Handle("/", http.StripPrefix("/", http.FileServer(http.Dir(*root))))
	err := http.ListenAndServe(*addr, nil)
	if err != nil {
		log.Printf("%v", err)
	}
}

網(wǎng)頁上傳

新建文件upload.html放到http服務(wù)器root目錄。例如upload文件夾

<!DOCTYPE html>
 <html>
      <head>
      <meta charset="utf-8">
      <title>go 上傳test</title>
     </head>
<body>
<form method="POST" action="/v1/file_upload" enctype="multipart/form-data" >
<input type="file" name="uploadfile" />
<input type="submit" value="上傳">
</form>
</body>
</html>

三分鐘用Golang搭建一個(gè)HTTP文件上傳下載服務(wù)器
三分鐘用Golang搭建一個(gè)HTTP文件上傳下載服務(wù)器

參考

《如何為 HTTP Server 增加 HTTP Basic Auth 》文章來源地址http://www.zghlxwxcb.cn/news/detail-512494.html

到了這里,關(guān)于三分鐘用Golang搭建一個(gè)HTTP文件上傳下載服務(wù)器的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 調(diào)用hutool包調(diào)用http接口處理文件流-文件的上傳下載工具類

    hutool工具類get請(qǐng)求獲取流: InputStream inputStream = HttpRequest.get(fileUrl).execute().bodyStream(); hutool工具類post請(qǐng)求上傳文件流: String resp = HttpRequest.post(url).header(Header.CONTENT_TYPE.getValue(), ContentType.MULTIPART.getValue()).form(params).execute().body(); 完成代碼

    2024年01月17日
    瀏覽(27)
  • Golang Gin框架HTTP上傳文件

    Golang Gin框架HTTP上傳文件

    HTTP上傳的文件的原理 HTTP協(xié)議的文件上傳是通過HTTP POST請(qǐng)求實(shí)現(xiàn)的,使用multipart/form-data格式將待上傳的文件放入請(qǐng)求體中。 服務(wù)器根據(jù)請(qǐng)求頭中的boundary參數(shù)來解析請(qǐng)求體,并根據(jù)Content-Disposition字段獲取文件名等信息,根據(jù)Content-Type字段判斷文件類型并保存到相應(yīng)位置。

    2024年02月05日
    瀏覽(31)
  • Java實(shí)現(xiàn)HTTP的上傳與下載

    相信很多人對(duì)于java文件下載的過程都存在一些疑惑,比如下載上傳文件會(huì)不會(huì)占用vm內(nèi)存,上傳/下載大文件會(huì)不會(huì)導(dǎo)致oom。下面從字節(jié)流的角度看下載/上傳的實(shí)現(xiàn),可以更加深入理解文件的上傳和下載功能。 首先明確,文件下載不僅僅只有下載方,還有服務(wù)端也就是返回文

    2024年02月10日
    瀏覽(17)
  • SpringBoot+vue文件上傳&下載&預(yù)覽&大文件分片上傳&文件上傳進(jìn)度

    SpringBoot+vue文件上傳&下載&預(yù)覽&大文件分片上傳&文件上傳進(jìn)度

    SpringBoot+vue 大文件分片下載 Blob File spark-md5根據(jù)文件內(nèi)容生成hash 大文件分片上傳(批量并發(fā),手動(dòng)上傳)vue組件封裝-form組件 vue上傳大文件/視頻前后端(java)代碼 springboot+vue自定義上傳圖片及視頻 SpringBoot + VUE實(shí)現(xiàn)前臺(tái)上傳文件獲取實(shí)時(shí)進(jìn)度( 使用commons-fileupload設(shè)置上傳監(jiān)聽

    2024年02月05日
    瀏覽(68)
  • 文件上傳及oss簡(jiǎn)單上傳及下載

    文件上傳及oss簡(jiǎn)單上傳及下載

    文件上傳就是通過io流復(fù)制到瀏覽器的過程 快速實(shí)現(xiàn)文件上傳功能 1.后臺(tái)實(shí)現(xiàn)文件上傳功能? 定義controllere 定義serevice 文件上傳不會(huì)直接上傳真是的目錄,它一定要經(jīng)過一個(gè)臨時(shí)目錄的中轉(zhuǎn)以后,才會(huì)上傳到真是目錄。作用: 防止上傳出現(xiàn)網(wǎng)絡(luò)斷開,或者用戶上傳直接刷新或

    2023年04月09日
    瀏覽(32)
  • 【Postman】 測(cè)試文件上傳、下載
一、使用PostMan測(cè)試文件上傳接口

    【Postman】 測(cè)試文件上傳、下載 一、使用PostMan測(cè)試文件上傳接口

    1、、選擇post請(qǐng)求方式,輸入請(qǐng)求地址 ? 二、填寫Headers? 一般是自動(dòng)生成的 Key:Content-Type Value:multipart/form-data 如下圖 ? 三、填寫body 選擇form-data? ? ?然后選擇文件file? ? 點(diǎn)擊添加文件,最后發(fā)送即可 ? 1、反饋異常,先排查 Headers中 Conten-Type 與 ”文件類型“是否匹配 ?

    2024年02月11日
    瀏覽(40)
  • 前端常用的上傳下載文件的幾種方式,直接上傳、下載文件,讀取.xlsx文件數(shù)據(jù),導(dǎo)出.xlsx數(shù)據(jù)

    1.1根據(jù)文件流Blob進(jìn)行下載 1.2根據(jù)下載文件鏈接直接進(jìn)行下載 html

    2024年02月12日
    瀏覽(22)
  • 下載文件 + 上傳文件

    記錄一下js實(shí)現(xiàn)下載文件的方式 下載文件 方式一:a 鏈接下載:模擬a鏈接的點(diǎn)擊,把后端返回的下載地址設(shè)置給a鏈接的href屬性 2. 文件流下載 前端接收 type: “application/octet-stream“ 格式的數(shù)據(jù)并下載,還有后端既返回octet-stream還返回JSON數(shù)據(jù)時(shí)的處理方法, 后端改了一下文件下

    2024年02月12日
    瀏覽(19)
  • 文件上傳下載系列——如何實(shí)現(xiàn)文件秒傳

    文件上傳下載系列——如何實(shí)現(xiàn)文件秒傳

    ??簡(jiǎn)介: ??核心思想: MD5是什么? 實(shí)現(xiàn)步驟: ??實(shí)操: 1、java生成文件MD5碼 2、javascript生成文件MD5碼 ??基于秒傳的分片上傳下載 上傳: 下載: ??MD5存儲(chǔ)位置 1、持久化到數(shù)據(jù)庫中 2、存儲(chǔ)到redis中 ??總結(jié) ????????文件秒傳是指在文件上傳過程中,如果上傳的文件

    2024年02月01日
    瀏覽(35)
  • Selenium基礎(chǔ) — 文件上傳&文件下載

    Selenium基礎(chǔ) — 文件上傳&文件下載

    說明: 文件上傳是web頁面上很常見的一個(gè)功能,用腳本去實(shí)現(xiàn)文件上傳很簡(jiǎn)單。 一般場(chǎng)景:在頁面中的上傳按鈕是一個(gè)input標(biāo)簽,其中type屬性為 type=\\\"file\\\" ,這種可以用selenium提供的 send_keys() 方法輕松解決。 示例: 頁面代碼片段: 腳本代碼: ?提示: 另外一種非input標(biāo)簽的

    2024年02月02日
    瀏覽(20)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包