@@ -736,7 +736,7 @@ func (f *fileHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
736
736
upath = "/" + upath
737
737
r .URL .Path = upath
738
738
}
739
- if r .Method == "POST" {
739
+ if r .Method == http . MethodPost || r . Method == http . MethodPut {
740
740
if err := uploadFile (w , r , f .root , path .Clean (upath )); err != nil {
741
741
log .Printf ("upload file failed %s\n " , err )
742
742
w .WriteHeader (http .StatusInternalServerError )
@@ -750,12 +750,12 @@ func (f *fileHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
750
750
// upload file
751
751
func uploadFile (w http.ResponseWriter , r * http.Request , fs FileSystem , name string ) error {
752
752
r .ParseMultipartForm (32 << 20 )
753
- file , handler , err := r . FormFile ( "file" )
753
+ file , filename , err := getFilefromRequest ( r )
754
754
if err != nil {
755
755
log .Printf ("read upload form failed %s\n " , err )
756
756
return err
757
757
}
758
- var filename = handler . Filename
758
+ defer file . Close ()
759
759
log .Printf ("upload file filename=%s to directory %s" , filename , path .Join (dir , name ))
760
760
if _ , err := os .Stat (path .Join (dir , name )); err != nil {
761
761
if os .IsNotExist (err ) {
@@ -771,7 +771,6 @@ func uploadFile(w http.ResponseWriter, r *http.Request, fs FileSystem, name stri
771
771
return err
772
772
}
773
773
log .Printf ("Writing %s\n " , fh .Name ())
774
- defer file .Close ()
775
774
var buffer = make ([]byte , 10 * 1024 * 1024 )
776
775
for {
777
776
n , err := file .Read (buffer )
@@ -789,6 +788,20 @@ func uploadFile(w http.ResponseWriter, r *http.Request, fs FileSystem, name stri
789
788
return nil
790
789
}
791
790
791
+ func getFilefromRequest (r * http.Request ) (io.ReadCloser , string , error ) {
792
+ if r .Method != http .MethodPut && r .Method != http .MethodPost {
793
+ return nil , "" , errors .New ("only GET and HEAD method support" )
794
+ }
795
+ if err := r .ParseMultipartForm (32 << 20 ); err != nil {
796
+ return r .Body , path .Base (r .URL .Path ), nil
797
+ }
798
+ file , handler , err := r .FormFile ("file" )
799
+ if err != nil {
800
+ return r .Body , path .Base (r .URL .Path ), nil
801
+ }
802
+ return file , handler .Filename , nil
803
+ }
804
+
792
805
// httpRange specifies the byte range to be sent to the client.
793
806
type httpRange struct {
794
807
start , length int64
0 commit comments