2016-12-17 212 views
0

我正嘗試使用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之外,並且正如其他用戶將要上傳的那樣。有沒有反正我可以得到一個相對路徑..

回答

2

POST後到您的API,圖像臨時保存在操作系統的臨時目錄(不同的操作系統的)不同的默認情況下。爲了得到這個目錄就可以使用,例如:

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

其中:

  • 文件名是在您的POST請求收到header.Filename,即文件名。在杜松子酒Gonic框架,你得到它在你的請求處理程序爲:
file, header, err := c.Request.FormFile("file") 
if err != nil { 
    return out, err 
} 
defer file.Close() 

例子:https://github.com/gin-gonic/gin#another-example-upload-file

我確定在你的框架中會有一個模擬。

  • os.TempDir()是一個函數go給你一個臨時文件夾(詳細信息:https://golang.org/pkg/os/#TempDir)。
  • TrimRight用於確保os.TempDir的結果是在不同的操作系統

一致的,那你就用它作爲

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

非常感謝你的是解決它 –