Golang中如何使用ioutil.WriteFile将文件保存到指定目录

Golang中如何使用ioutil.WriteFile将文件保存到指定目录

// 此页面提供用于测试的Base64编码小型自定义图像
package main

import (
    b64 "encoding/base64"
    "io/ioutil"
  "time"
  "math/rand"
)


func main() {
  data := "iVBORw0KGgoAAAANSUhEUgAAAGQAAABkCAQAAADa613fAAAAaUlEQVR42u3PQREAAAgDINc/9Izg34MGpJ0XIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiJyWYprx532021aAAAAAElFTkSuQmCC"
    sDec, _ := b64.StdEncoding.DecodeString(data)

  rand.Seed(time.Now().UnixNano())
    ioutil.WriteFile( randSeq(12) +".jpg",sDec, 0644)// 这可以工作

  // 这个不行
  ioutil.TempDir( "img/", randSeq(12) +".jpg") // 这是我需要的方式
}


var letters = []rune("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ")

func randSeq(n int) string {
    b := make([]rune, n)
    for i := range b {
        b[i] = letters[rand.Intn(len(letters))]
    }
    return string(b)
}

更多关于Golang中如何使用ioutil.WriteFile将文件保存到指定目录的实战教程也可以访问 https://www.itying.com/category-94-b0.html

13 回复

没有返回任何错误,我今晚会再试一次,但这代码不工作真的很奇怪。

更多关于Golang中如何使用ioutil.WriteFile将文件保存到指定目录的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


是的,但它不接受位置参数,这就是问题所在。我以为我修复了,但并没有。

当然,它确实接受这个位置,只是在你写入之前,这个位置需要已经存在。

你可以直接向 WriteFile 提供相对路径或绝对路径,不过我不太确定你使用 TempFile 的目的是什么。

将文件写入 img/ 目录下,例如 img/foo.jpg

这应该能正常工作,前提是路径确实存在,并且对启动程序的用户是可写的。

另外,作为相关提示:请检查返回的 error 值,并告诉我们它说了什么,除非您自己已经理解了它的含义……

这是什么意思?

因为 writefile 函数具有以下签名,并且很容易看出它实际上接收三个参数:

WriteFile(filename string, data []byte, perm os.FileMode) error

你说得对,我之前只是搞混了,它的工作原理是这样的

ioutil.WriteFile("img/"+randSeq(12)+".jpg", sDec, 0644)

然后只需执行 ioutil.WriteFile("img/foo.jpg", data, mode)

func main() {
    fmt.Println("hello world")
}

到目前为止,我对一个简单的事情感到困惑, 如何让这段代码使用我名为 img 的文件夹位置

ioutil.WriteFile(randSeq(12)+".jpg", sDec, 0644)

你是想将文件写入 img/ 目录下,例如 img/foo.jpg 吗?还是想img/ 目录创建一个临时目录,然后再将文件写入这个临时目录内,例如 foo/someRandomTempDir/foo.jpg

尝试类似这样的方法:

    path := "img/" + randSeq(12) + ".jpg"
    if err := ioutil.WriteFile(path, sDec, 0644); err != nil {
        log.Panic(err)
    }

    fmt.Println(path)

请参阅 https://play.golang.org/p/Mi75N2pI_V1

在Golang中使用ioutil.WriteFile将文件保存到指定目录,需要先构建完整的文件路径。以下是修正后的代码示例:

package main

import (
    b64 "encoding/base64"
    "io/ioutil"
    "path/filepath"
    "time"
    "math/rand"
)

func main() {
    data := "iVBORw0KGgoAAAANSUhEUgAAAGQAAABkCAQAAADa613fAAAAaUlEQVR42u3PQREAAAgDINc/9Izg34MGpJ0XIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiJyWYprx532021aAAAAAElFTkSuQmCC"
    sDec, _ := b64.StdEncoding.DecodeString(data)

    rand.Seed(time.Now().UnixNano())
    
    // 构建完整文件路径
    filename := randSeq(12) + ".jpg"
    dirPath := "img/"
    fullPath := filepath.Join(dirPath, filename)
    
    // 写入文件到指定目录
    ioutil.WriteFile(fullPath, sDec, 0644)
}

var letters = []rune("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ")

func randSeq(n int) string {
    b := make([]rune, n)
    for i := range b {
        b[i] = letters[rand.Intn(len(letters))]
    }
    return string(b)
}

关键点:

  1. 使用filepath.Join()构建跨平台的完整路径
  2. 确保目标目录存在(如果需要可以添加目录创建逻辑)
  3. ioutil.WriteFile()需要完整的文件路径作为第一个参数

如果需要确保目录存在,可以添加:

import "os"

// 在写入文件前检查并创建目录
if _, err := os.Stat("img/"); os.IsNotExist(err) {
    os.MkdirAll("img/", 0755)
}
回到顶部