Go:获取文件名称、前缀、后缀和上传示例代码

51 min read

示例代码:

package main

import (
    "fmt"
    "path"
)
func main() {
    filename := "device/sdk/CMakeLists.txt"
    filenameall := path.Base(filename)    
    filesuffix := path.Ext(filename)
    fileprefix := filenameall[0:len(filenameall) - len(filesuffix)]
    //fileprefix, err := strings.TrimSuffix(filenameall, filesuffix)

    fmt.Println("file name:", filenameall)
    fmt.Println("file prefix:", fileprefix)
    fmt.Println("file suffix:", filesuffix)
}

执行结果:

file name: CMakeLists.txt
file prefix: CMakeLists
file suffix: .txt

path.Base(filename):获取不包含目录的文件名

path.Ext(filename):获取文件后缀

文件前缀 可以使用切片的方式获取:

fileprefix := filenameall[0:len(filenameall) - len(filesuffix)]

也可以使用 strings.TrimSuffix() 进行获取:

import "strings"

fileprefix, err := strings.TrimSuffix(filenameall, filesuffix)

Go文件上传

package main

import (
  "bytes"
  "fmt"
  "io"
  "io/ioutil"
  "mime/multipart"
  "net/http"
  "os"
  "path"
)

func postFile(filename string, targetUrl string) error {
  bodyBuf := &bytes.Buffer{}
  bodyWriter := multipart.NewWriter(bodyBuf)

  // 关键的一步操作
  fileWriter, err := bodyWriter.CreateFormFile("file", path.Base(filename))
  if err != nil {
    fmt.Println("error writing to buffer")
    return err
  }

  // 打开文件句柄操作
  fh, err := os.Open(filename)
  if err != nil {
    fmt.Println("error opening file")
    return err
  }
  defer fh.Close()

  // iocopy
  _, err = io.Copy(fileWriter, fh)
  if err != nil {
    return err
  }

  contentType := bodyWriter.FormDataContentType()
  bodyWriter.Close()

  resp, err := http.Post(targetUrl, contentType, bodyBuf)
  if err != nil {
    return err
  }
  defer resp.Body.Close()
  resp_body, err := ioutil.ReadAll(resp.Body)
  if err != nil {
    return err
  }
  fmt.Println(resp.Status)
  fmt.Println(string(resp_body))
  return nil
}

// sample usage
func main() {

  targetUrl  := "http://local:8880/upload"
  if len(os.Args) > 1 {

    filename := os.Args[2]
    postFile(filename, targetUrl)
    // do something with command
  } else {
    // No arguments were specified!
    fmt.Println("没有传入图片地址")
  }
}