1
1
package infura
2
2
3
3
import (
4
- "bytes"
5
4
"encoding/json"
6
5
"fmt"
7
6
"io"
8
7
"io/ioutil"
9
8
"mime/multipart"
10
9
"net/http"
11
10
"os"
11
+ fp "path/filepath"
12
12
"time"
13
13
)
14
14
@@ -21,29 +21,35 @@ const (
21
21
22
22
func PinFile (filepath string ) (string , error ) {
23
23
uri := fmt .Sprintf ("%s://%s:%d/api/v0/add" , INFURA_PROTOCAL , INFURA_HOST , INFURA_PORT )
24
- body := & bytes.Buffer {}
25
- writer := multipart .NewWriter (body )
26
- defer writer .Close ()
27
24
28
- part , err := writer .CreateFormFile ("file" , filepath )
29
- if err != nil {
30
- return "" , err
31
- }
32
25
file , err := os .Open (filepath )
33
26
if err != nil {
34
27
return "" , err
35
28
}
36
29
defer file .Close ()
37
30
38
- if _ , err = io .Copy (part , file ); err != nil {
39
- return "" , err
40
- }
31
+ r , w := io .Pipe ()
32
+ m := multipart .NewWriter (w )
33
+
34
+ go func () {
35
+ defer w .Close ()
36
+ defer m .Close ()
37
+
38
+ part , err := m .CreateFormFile ("file" , fp .Base (file .Name ()))
39
+ if err != nil {
40
+ return
41
+ }
42
+
43
+ if _ , err = io .Copy (part , file ); err != nil {
44
+ return
45
+ }
46
+ }()
41
47
42
48
client := & http.Client {
43
49
Timeout : 30 * time .Second ,
44
50
}
45
- req , err := http .NewRequest (http .MethodPost , uri , body )
46
- req .Header .Add ("Content-Type" , writer .FormDataContentType ())
51
+ req , err := http .NewRequest (http .MethodPost , uri , r )
52
+ req .Header .Add ("Content-Type" , m .FormDataContentType ())
47
53
resp , err := client .Do (req )
48
54
if err != nil {
49
55
return "" , err
0 commit comments