Chris Lu
7 years ago
5 changed files with 197 additions and 109 deletions
-
76weed/filesys/dir.go
-
21weed/filesys/file.go
-
2weed/server/master_ui/templates.go
-
93weed/storage/needle.go
-
100weed/storage/needle_parse_multipart.go
@ -0,0 +1,100 @@ |
|||||
|
package storage |
||||
|
|
||||
|
import ( |
||||
|
"mime" |
||||
|
"github.com/chrislusf/seaweedfs/weed/operation" |
||||
|
"github.com/chrislusf/seaweedfs/weed/glog" |
||||
|
"net/http" |
||||
|
"path" |
||||
|
"io/ioutil" |
||||
|
"strings" |
||||
|
) |
||||
|
|
||||
|
func parseMultipart(r *http.Request, isChunkedFile bool) ( |
||||
|
fileName string, data []byte, mimeType string, isGzipped bool, e error) { |
||||
|
form, fe := r.MultipartReader() |
||||
|
if fe != nil { |
||||
|
glog.V(0).Infoln("MultipartReader [ERROR]", fe) |
||||
|
e = fe |
||||
|
return |
||||
|
} |
||||
|
|
||||
|
//first multi-part item
|
||||
|
part, fe := form.NextPart() |
||||
|
if fe != nil { |
||||
|
glog.V(0).Infoln("Reading Multi part [ERROR]", fe) |
||||
|
e = fe |
||||
|
return |
||||
|
} |
||||
|
|
||||
|
fileName = part.FileName() |
||||
|
if fileName != "" { |
||||
|
fileName = path.Base(fileName) |
||||
|
} |
||||
|
|
||||
|
data, e = ioutil.ReadAll(part) |
||||
|
if e != nil { |
||||
|
glog.V(0).Infoln("Reading Content [ERROR]", e) |
||||
|
return |
||||
|
} |
||||
|
|
||||
|
//if the filename is empty string, do a search on the other multi-part items
|
||||
|
for fileName == "" { |
||||
|
part2, fe := form.NextPart() |
||||
|
if fe != nil { |
||||
|
break // no more or on error, just safely break
|
||||
|
} |
||||
|
|
||||
|
fName := part2.FileName() |
||||
|
|
||||
|
//found the first <file type> multi-part has filename
|
||||
|
if fName != "" { |
||||
|
data2, fe2 := ioutil.ReadAll(part2) |
||||
|
if fe2 != nil { |
||||
|
glog.V(0).Infoln("Reading Content [ERROR]", fe2) |
||||
|
e = fe2 |
||||
|
return |
||||
|
} |
||||
|
|
||||
|
//update
|
||||
|
data = data2 |
||||
|
fileName = path.Base(fName) |
||||
|
break |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
if !isChunkedFile { |
||||
|
|
||||
|
dotIndex := strings.LastIndex(fileName, ".") |
||||
|
ext, mtype := "", "" |
||||
|
if dotIndex > 0 { |
||||
|
ext = strings.ToLower(fileName[dotIndex:]) |
||||
|
mtype = mime.TypeByExtension(ext) |
||||
|
} |
||||
|
contentType := part.Header.Get("Content-Type") |
||||
|
if contentType != "" && mtype != contentType { |
||||
|
mimeType = contentType //only return mime type if not deductable
|
||||
|
mtype = contentType |
||||
|
} |
||||
|
|
||||
|
if part.Header.Get("Content-Encoding") == "gzip" { |
||||
|
isGzipped = true |
||||
|
} else if operation.IsGzippable(ext, mtype) { |
||||
|
if data, e = operation.GzipData(data); e != nil { |
||||
|
return |
||||
|
} |
||||
|
isGzipped = true |
||||
|
} |
||||
|
if ext == ".gz" { |
||||
|
if strings.HasSuffix(fileName, ".css.gz") || |
||||
|
strings.HasSuffix(fileName, ".html.gz") || |
||||
|
strings.HasSuffix(fileName, ".txt.gz") || |
||||
|
strings.HasSuffix(fileName, ".js.gz") { |
||||
|
fileName = fileName[:len(fileName)-3] |
||||
|
isGzipped = true |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
return |
||||
|
} |
Write
Preview
Loading…
Cancel
Save
Reference in new issue