2016-12-17 20 views
0

私はs3アカウントにGolangとamazon s3 apiを使用して画像をアップロードしようとしています。私は、アップロードされた想像を得ることができれば、私のハードコードダイレクトパスなどOSオープンを使用してs3にGolangファイルをアップロード

file, err := os.Open("/Users/JohnSmith/Documents/pictures/cars.jpg") 
    defer file.Close() 
    if err != nil { 
     fmt.Printf("err opening file: %s", err) 
    } 

としてIハードコードなら、絵は私の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の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)) 

} 

で最初に私のコードです

次のエラーが発生する

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

イメージは一時的にOSの一時ディレクトリに保存されます(別のOSで異なる)。たとえば、あなたが使用することができ、このディレクトリを取得するには、次の

  • ファイル名があなたのPOSTリクエストで受信header.Filename、すなわち、ファイル名は次のとおりです。

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

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ジンGonicフレームワークでは、としてあなたの要求ハンドラでそれを取得します。

あなたのフレームワークにはアナログがあります。

  • os.TempDir()は、一時フォルダ(詳細:https://golang.org/pkg/os/#TempDir)を実行する関数です。 TrimRightがos.TempDirの結果を保証するために使用される
  • は、異なるOS

に一致している。そして、あなたは

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

としてそれを使用し、それを解決しているありがとうございました –

関連する問題