图片路径为项目main.go文件同一层级目录的图片
package main
import (
"fmt"
"os"
openapi "github.com/alibabacloud-go/darabonba-openapi/v2/client"
stream "github.com/alibabacloud-go/darabonba-stream/client"
util "github.com/alibabacloud-go/tea-utils/v2/service"
"github.com/alibabacloud-go/tea/tea"
)
/**
// 必填,您的 AccessKey ID
AccessKeyId: accessKeyId,
// 必填,您的 AccessKey Secret
AccessKeySecret: accessKeySecret,
}/**
// 接口名称
Action: tea.String("RecognizePassport"),
// 接口版本
Version: tea.String("2021-07-07"),
// 接口协议
Protocol: tea.String("HTTPS"),
// 接口 HTTP 方法
Method: tea.String("POST"),
AuthType: tea.String("AK"),
Style: tea.String("V3"),
// 接口 PATH
Pathname: tea.String("/"),
// 接口请求体内容格式
ReqBodyType: tea.String("json"),
// 接口响应体内容格式
BodyType: tea.String("json"),
}func _mainCommon(args []*string) (_err error) {
client, _err := CreateClientCommon(tea.String(os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_ID")), tea.String(os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET")))
if _err != nil {
return _err
}
params := CreateApiInfoCommon()
// 需要安装额外的依赖库,直接点击下载完整工程即可看到所有依赖。
body := stream.ReadFromFilePath(tea.String("passport.jpg"))
// runtime options
runtime := &util.RuntimeOptions{}
request := &openapi.OpenApiRequest{
Stream: body,
}
// 复制代码运行请自行打印 API 的返回值
// 返回值为 Map 类型,可从 Map 中获得三类数据:响应体 body、响应头 headers、HTTP 返回的状态码 statusCode。
resp, _err := client.CallApi(params, request, runtime)
if _err != nil {
return _err
}
fmt.Println(resp)
return _err
}
func main() {
err := _mainCommon(tea.StringSlice(os.Args[1:]))
if err != nil {
panic(err)
}
}
这个错误通常是由于在文件操作完成后没有正确关闭文件导致的。在使用Go语言的SDK时,确保在完成文件操作后使用ioutil.ReadAll()
或io.Copy()
等函数将文件内容读取到内存中,然后关闭文件。
以下是一个示例代码:
package main
import (
"fmt"
"io/ioutil"
"os"
)
func main() {
// 打开文件
file, err := os.Open("example.txt")
if err != nil {
fmt.Println("Error opening file:", err)
return
}
defer file.Close() // 确保文件在操作完成后被关闭
// 读取文件内容
content, err := ioutil.ReadAll(file)
if err != nil {
fmt.Println("Error reading file:", err)
return
}
// 输出文件内容
fmt.Println(string(content))
}
在这个示例中,我们使用os.Open()
函数打开一个名为example.txt
的文件,然后使用ioutil.ReadAll()
函数将文件内容读取到内存中。最后,我们使用fmt.Println()
函数输出文件内容。注意,我们在打开文件后使用了defer file.Close()
语句来确保文件在操作完成后被关闭。
在使用Golang版本的视觉智能护照识别接口SDK时,如果遇到“file already closed”的错误,通常表示你尝试读取或操作的文件句柄已经关闭了。在处理图像文件上传至服务端进行护照识别的过程中,可能的原因包括:
file, err := os.Open("passport_image.jpg")
if err != nil {
// 处理错误
}
defer file.Close() // 确保文件在函数结束时关闭
// 在这里读取文件并调用护照识别API
多次关闭文件:
如果在代码中不小心多次调用了Close()
方法,也会导致这个错误。检查是否有重复关闭文件的操作。
并发访问文件:
如果在并发环境下同时对同一文件进行读写操作,可能会出现文件被提前关闭的情况。请确保对文件的访问是线程安全的。
楼主你好,看了你的描述信息,根据您提供的代码,报错 file already closed
可能是因为你在使用 stream.ReadFromFilePath
时,文件被关闭了,你可以尝试将图片文件读取到内存中再进行传递给接口调用,请尝试修改的代码如下:
func _mainCommon(args []*string) (_err error) {
client, _err := CreateClientCommon(tea.String(os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_ID")), tea.String(os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET")))
if _err != nil {
return _err
}
params := CreateApiInfoCommon()
// 读取图片文件到内存
file, _err := os.Open("passport.jpg")
if _err != nil {
return _err
}
defer file.Close()
fileInfo, _err := file.Stat()
if _err != nil {
return _err
}
fileSize := fileInfo.Size()
buffer := make([]byte, fileSize)
_, _err = file.Read(buffer)
if _err != nil {
return _err
}
body := tea.BytesToReadSeekCloser(buffer)
// runtime options
runtime := &util.RuntimeOptions{}
request := &openapi.OpenApiRequest{
Stream: body,
}
// 复制代码运行请自行打印 API 的返回值
// 返回值为 Map 类型,可从 Map 中获得三类数据:响应体 body、响应头 headers、HTTP 返回的状态码 statusCode。
resp, _err := client.CallApi(params, request, runtime)
if _err != nil {
return _err
}
fmt.Println(resp)
return _err
}
注意:修改后的代码会将图片文件读取到内存中,并在使用后关闭文件。这样可以避免 file already closed
的错误。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。