Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
File upload 使用OS Open将Golang文件上载到s3_File Upload_Go_Amazon S3 - Fatal编程技术网

File upload 使用OS Open将Golang文件上载到s3

File upload 使用OS Open将Golang文件上载到s3,file-upload,go,amazon-s3,File Upload,Go,Amazon S3,我正在尝试使用Golang和AmazonS3API将图像上传到我的s3帐户。如果我硬编码直接路径,比如 file, err := os.Open("/Users/JohnSmith/Documents/pictures/cars.jpg") defer file.Close() if err != nil { fmt.Printf("err opening file: %s", err) } 如果我像那样硬编码文件路径,那么图片将上传到我的s3帐户。然

我正在尝试使用Golang和AmazonS3API将图像上传到我的s3帐户。如果我硬编码直接路径,比如

file, err :=  os.Open("/Users/JohnSmith/Documents/pictures/cars.jpg")
    defer file.Close()
    if err != nil {
        fmt.Printf("err opening file: %s", err)
    }
如果我像那样硬编码文件路径,那么图片将上传到我的s3帐户。然而,这种方法并不好,因为我显然无法硬编码我想要上传的每个图像的直接图像路径。我的问题是如何上传图像而不必硬编码路径。这将是一个API的一部分,用户将上传图像,所以我显然不能有一个硬编码的路径。这是我的代码,首先是HTML

<form method="post" enctype="multipart/form-data"  action="profile_image">
    <h2>Image Upload</h2>
    <p><input type="file" name="file" id="file"/> </p>
       <p> <input type="submit" value="Upload Image"></p>

</form>
这是我上面的完整代码,但是当我尝试执行以下操作时

file, err :=  os.Open("file")
    defer file.Close()
    if err != nil {
        fmt.Printf("err opening file: %s", err)
    }
我得到以下错误

http: panic serving [::1]:55454: runtime error: invalid memory address or nil pointer dereference
goroutine 7 [running]:
err opening file: open file: no such file or directorynet/http.(*conn).serve.func1(0xc420076e80)

我不能使用绝对路径(filepath.Abs()),因为一些文件将在GoPath之外,并且如前所述,其他用户将上载。无论如何,我都可以获得相对路径。

在发布到API后,默认情况下,图像临时保存在操作系统的临时目录中(不同操作系统的图像不同)。要获取此目录,您可以使用,例如:

func GetTempLoc(filename string) string {
    return strings.TrimRight(os.TempDir(), "/") + "/" + filename
}
其中:

  • filename是一个header.filename,即在POST请求中收到的文件名。在Gin Gonic框架中,您可以在请求处理程序中获得它,如下所示:
文件,头,错误:=c.Request.FormFile(“文件”)
如果出错!=零{
返回,错误
}
延迟文件。关闭()
示例:

我相信在你的框架中会有类似的情况

  • TempDir()是一个函数,用于为您提供一个临时文件夹(详细信息:)
  • TrimRight用于确保os.TempDir的结果在不同的os上是一致的
然后你把它当作

file, err := os.Open(GetTempLoc(fileName))
...

在发布到API后,默认情况下,图像临时保存在操作系统的临时目录中(不同操作系统的临时目录不同)。要获取此目录,您可以使用,例如:

func GetTempLoc(filename string) string {
    return strings.TrimRight(os.TempDir(), "/") + "/" + filename
}
其中:

  • filename是一个header.filename,即在POST请求中收到的文件名。在Gin Gonic框架中,您可以在请求处理程序中获得它,如下所示:
文件,头,错误:=c.Request.FormFile(“文件”)
如果出错!=零{
返回,错误
}
延迟文件。关闭()
示例:

我相信在你的框架中会有类似的情况

  • TempDir()是一个函数,用于为您提供一个临时文件夹(详细信息:)
  • TrimRight用于确保os.TempDir的结果在不同的os上是一致的
然后你把它当作

file, err := os.Open(GetTempLoc(fileName))
...