我正嘗試使用Golang和amazon s3 api將圖像上傳到我的s3帳戶。我能得到想象上傳,如果我硬編碼的直接路徑,如使用操作系統將Golang文件上傳到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>
那麼這是我的HTTP POST功能方法
func UploadProfile(w http.ResponseWriter, r *http.Request) {
r.ParseForm()
var resultt string
resultt = "Hi"
sess, _ := session.NewSession(&aws.Config{
Region: aws.String("us-west-2"),
Credentials: credentials.NewStaticCredentials(aws_access_key_id,aws_secret_access_key, ""),
})
svc := s3.New(sess)
file, err := os.Open("Users/JohnSmith/Documents/pictures/cars.jpg")
defer file.Close()
if err != nil {
fmt.Printf("err opening file: %s", err)
}
fileInfo, _ := file.Stat()
size := fileInfo.Size()
buffer := make([]byte, size) // read file content to buffer
file.Read(buffer)
fileBytes := bytes.NewReader(buffer)
fileType := http.DetectContentType(buffer)
path := file.Name()
params := &s3.PutObjectInput{
Bucket: aws.String("my-bucket"),
Key: aws.String(path),
Body: fileBytes,
ContentLength: aws.Int64(size),
ContentType: aws.String(fileType),
}
resp, err := svc.PutObject(params)
if err != nil {
fmt.Printf("bad response: %s", err)
}
fmt.Printf("response %s", awsutil.StringValue(resp))
}
也就是說但是我上面的完整的代碼,當我嘗試做一些事情,如
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之外,並且正如其他用戶將要上傳的那樣。有沒有反正我可以得到一個相對路徑..
非常感謝你的是解決它 –