Chris Lu
7 years ago
5 changed files with 197 additions and 109 deletions
-
88weed/filesys/dir.go
-
23weed/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