gpt4 book ai didi

go - 如何附加文件(io.Reader)?

转载 作者:IT王子 更新时间:2023-10-29 01:45:21 26 4
gpt4 key购买 nike

func SimpleUploader(r *http.Request, w http.ResponseWriter) {
// temp folder path
chunkDirPath := "./creatives/.uploads/" + userUUID
// create folder
err = os.MkdirAll(chunkDirPath, 02750)

// Get file handle from multipart request
var file io.Reader
mr, err := r.MultipartReader()

var fileName string
// Read multipart body until the "file" part
for {
part, err := mr.NextPart()
if err == io.EOF {
break
}
if part.FormName() == "file" {
file = part
fileName = part.FileName()
fmt.Println(fileName)
break
}
}

// Create files
tempFile := chunkDirPath + "/" + fileName
dst, err := os.Create(tempFile)

defer dst.Close()

buf := make([]byte, 1024*1024)
file.Read(buf)
// write/save buffer to disk
ioutil.WriteFile(tempFile, buf, os.ModeAppend)
if http.DetectContentType(buf) != "video/mp4" {
response, _ := json.Marshal(&Response{"File upload cancelled"})
settings.WriteResponse(w, http.StatusInternalServerError, response)
return
}

// joinedFile := io.MultiReader(bytes.NewReader(buf), file)
_, err = io.Copy(dst, file)
if err != nil {
settings.LogError(err, methodName, "Error copying file")
}

response, _ := json.Marshal(&Response{"File uploaded successfully"})
settings.WriteResponse(w, http.StatusInternalServerError, response)
}

我正在上传视频文件。在上传整个文件之前,我想做一些检查,所以我将前 1mb 保存到一个文件中:

buf := make([]byte, 1024*1024)
file.Read(buf)
// write/save buffer to disk
ioutil.WriteFile(tempFile, buf, os.ModeAppend)

然后,如果检查通过,我想上传文件的其余部分 dst 是用于保存第一个 1 mb 的同一个文件 所以基本上我试图附加到文件:

_, err = io.Copy(dst, file)

上传的文件大小正确,但文件已损坏(无法播放视频)。

我还尝试了什么? : 加入两个读者并保存到一个新文件。但是使用这种方法,文件大小会增加 1 MB 并且已损坏。

joinedFile := io.MultiReader(bytes.NewReader(buf), file)
_, err = io.Copy(newDst, joinedFile)

请帮忙。

最佳答案

您基本上通过执行 os.Create 和 ioutil.WriteFile 打开文件两次

问题在于 os.Create 的返回值 (dst) 就像指向该文件开头的指针。 WriteFile 不会移动 dst 指向的位置。

您基本上是在执行 WriteFile,然后在 WriteFile 写入的第一组字节之上执行 io.Copy。

尝试先执行 WriteFile(带有 Create 标志),然后 os.OpenFile(而不是 os.Create)带有 Append 标志的同一文件将剩余字节追加到末尾。

另外,允许客户端给你文件名是非常危险的,因为它可能是 ../../.bashrc(例如),你会用用户决定上传的任何内容覆盖你的 shell init .

如果您自己计算文件名会更安全,如果您需要记住用户选择的文件名,请将其存储在您的数据库中,甚至是稍后加载的 metadata.json 类型的文件中。

关于go - 如何附加文件(io.Reader)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36895714/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com