golang下載文件服務器最後一個文件

main.go

package main

import (
	"flag"
	"github.com/PuerkitoBio/goquery"
	"io"
	"log"
	"net/http"
	"net/url"
	"os"
)

var (
	urlStr    = flag.String("url", "", "the download url")
	outputDir = flag.String("o", "", "the output dir")
)

func init() {
	flag.Parse()

	if *urlStr == "" {
		flag.PrintDefaults()
		os.Exit(0)
	}
	if l := len(*urlStr); (*urlStr)[l-1:] == "/" {
		*urlStr = (*urlStr)[:l-1]
	}

	if *outputDir == "" {
		*outputDir = "."
	}
	if l := len(*outputDir); (*outputDir)[l-1:] == "/" {
		*outputDir = (*outputDir)[:l-1]
	}

	os.MkdirAll(*outputDir, 0755)
}

func main() {
	download()
}

func download() bool {
	doc, err := goquery.NewDocument(*urlStr)
	if err != nil {
		log.Println("下載失敗", err.Error())
		return false
	}

	sl := doc.Find("a")
	if sl == nil {
		log.Println("沒有找到下載信息")
		return false
	}

	a := sl.Last()
	if a == nil {
		log.Println("沒有找到下載信息")
		return false
	}

	href, ok := a.Attr("href")
	if !ok {
		log.Println("沒有找到下載信息")
		return false
	}

	if href == "../" {
		log.Println("沒有找到下載信息")
		return false
	}

	downloadUrl := *urlStr + "/" + href
	encFilename, _ := url.PathUnescape(href)
	fileName := *outputDir + "/" + encFilename

	log.Println("開始下載", downloadUrl)

	f, err := os.Create(fileName)
	if err != nil {
		log.Println("下載失敗", err.Error())
		return false
	}
	defer f.Close()

	res, err := http.Get(downloadUrl)
	if err != nil {
		log.Println("下載失敗", err.Error())
		return false
	}

	if _, err := io.Copy(f, res.Body); err != nil {
		log.Println("下載失敗", err.Error())
		return false
	}

	log.Println("下載成功", fileName)

	return true
}

build

CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -ldflags "-s -w" -o dd.s

run

./dds -url http://192.168.1.100/down/ -o download/
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章