私は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の外にあり、他のユーザーがアップロードするため、絶対パスは使用できません。とにかく私は相対的なパスを得ることができますか?
としてそれを使用し、それを解決しているありがとうございました –