ioutil.ReadAll 也能实现文件写入,小文件还可以,大文件就内存不足了
这次我们使用 io.copy方法,它就是在文件指针之间直接复制的,不用全读入内存。
1.1 复制文件的功能实现
先说方法的实现,其实还是很简单的
/**
* 复制文件
* 同样适用于文件下载 如 CopyFile(http.ResponseWriter,/root/test.txt)
*/
func CopyFile(writer io.Writer, filePath string) error {
srcFile, err := os.Open(filePath)
if err != nil || os.IsNotExist(err) {
logUtil.Errorf("读取文件失败:%s", err.Error())
return err
}
_, err = io.Copy(writer, srcFile)
if err != nil {
logUtil.Errorf("写入文件失败:%s", err.Error())
return err
}
return nil
}
1.2 http页面导出文件
像导出execl文件,不必使用“xlsx.OpenFile”和ioutil.ReadAll 读取文件内容,通过文件指针就可以导出文件了
func exportFile(context *tgo.Context) {
context.SetWriteFile("导入模板.xlsx", "application/vnd.ms-excel")
err := CopyFile(context.ResponseWriter, "/data/workshop/project/file.xlsx")
if err != nil {
context.Result = util.ErrorCommonRespWithMsg(-1, "下载模板失败")
}
return
}
1.3 文件的复制
golang 复制文件
func CopyLocalFile(newFile ,srcFile string) error {
file, err := os.Open(newFile)
if err != nil {
logUtil.Errorf("创建文件失败:%s", err.Error())
return err
}
defer file.Close()
err := CopyFile(file, srcFile)
if err != nil {
logUtil.Errorf("复制文件失败:%s", err.Error())
return err
}
return nil
}