开发者社区 > 视觉智能 > 正文

护照识别接口,在运golang版本的sdk示例时一直报file already closed 的错误

image.png

image.png

图片路径为项目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"

)

/**

  • 使用AK&SK初始化账号Client
  • @param accessKeyId
  • @param accessKeySecret
  • @return Client
  • @throws Exception
    /
    func CreateClientCommon(accessKeyId
    string, accessKeySecret string) (_result openapi.Client, _err error) {
    config := &openapi.Config{
     // 必填,您的 AccessKey ID
     AccessKeyId: accessKeyId,
     // 必填,您的 AccessKey Secret
     AccessKeySecret: accessKeySecret,
    
    }
    // Endpoint 请参考 https://api.aliyun.com/product/ocr-api
    config.Endpoint = tea.String("ocr-api.cn-hangzhou.aliyuncs.com")
    _result = &openapi.Client{}
    _result, _err = openapi.NewClient(config)
    return _result, _err
    }

/**

  • API 相关
  • @param path params
  • @return OpenApi.Params
    /
    func CreateApiInfoCommon() (_result
    openapi.Params) {
    params := &openapi.Params{
     // 接口名称
     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"),
    
    }
    _result = params
    return _result
    }

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)
}
}

展开
收起
游客ebwuhuc2pvjmg 2024-01-11 17:42:07 68 0
3 条回答
写回答
取消 提交回答
  • 面对过去,不要迷离;面对未来,不必彷徨;活在今天,你只要把自己完全展示给别人看。

    这个错误通常是由于在文件操作完成后没有正确关闭文件导致的。在使用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()语句来确保文件在操作完成后被关闭。

    2024-01-12 21:28:49
    赞同 展开评论 打赏
  • 在使用Golang版本的视觉智能护照识别接口SDK时,如果遇到“file already closed”的错误,通常表示你尝试读取或操作的文件句柄已经关闭了。在处理图像文件上传至服务端进行护照识别的过程中,可能的原因包括:

    1. 文件打开后未正确关闭
      在读取文件内容之前,确保文件以只读模式成功打开,并且在读取完内容后正确关闭。
    file, err := os.Open("passport_image.jpg")
    if err != nil {
        // 处理错误
    }
    defer file.Close()  // 确保文件在函数结束时关闭
    
    // 在这里读取文件并调用护照识别API
    
    1. 多次关闭文件
      如果在代码中不小心多次调用了Close()方法,也会导致这个错误。检查是否有重复关闭文件的操作。

    2. 并发访问文件
      如果在并发环境下同时对同一文件进行读写操作,可能会出现文件被提前关闭的情况。请确保对文件的访问是线程安全的。

    2024-01-12 11:47:34
    赞同 展开评论 打赏
  • 十分耕耘,一定会有一分收获!

    楼主你好,看了你的描述信息,根据您提供的代码,报错 file already closed 可能是因为你在使用 stream.ReadFromFilePath 时,文件被关闭了,你可以尝试将图片文件读取到内存中再进行传递给接口调用,请尝试修改的代码如下:
    image.png

    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 的错误。

    2024-01-12 08:48:25
    赞同 展开评论 打赏

为开发者提供高易用、普惠的视觉API服务,帮助企业快速建立视觉智能技术应用能力的综合性视觉AI能力平台。适用于数字营销、互联网娱乐、安防、手机应用、泛金融身份认证等行业。

相关电子书

更多
从 SDK 到编解码:视频直播架构解析 立即下载
跨平台的云服务SDK需要什么 立即下载
一个跨平台的云服务SDK需要什么 立即下载

相关镜像