Browse Source

add store metadata:file name, mime type, is_gzipped

add support to upload .gz file directly
pull/2/head
Chris Lu 12 years ago
parent
commit
9b95430e9f
  1. 23
      weed-fs/src/cmd/weed/volume.go
  2. 3
      weed-fs/src/pkg/storage/compress.go
  3. 33
      weed-fs/src/pkg/storage/needle.go
  4. 7
      weed-fs/src/pkg/storage/needle_read_write.go

23
weed-fs/src/cmd/weed/volume.go

@ -129,10 +129,28 @@ func GetHandler(w http.ResponseWriter, r *http.Request) {
w.WriteHeader(http.StatusNotFound)
return
}
if n.NameSize > 0 {
fname := string(n.Name)
dotIndex := strings.LastIndex(fname, ".")
if dotIndex > 0 {
ext = fname[dotIndex:]
}
}
mtype := ""
if ext != "" {
mtype := mime.TypeByExtension(ext)
mtype = mime.TypeByExtension(ext)
}
if n.MimeSize > 0 {
mtype = string(n.Mime)
}
if mtype != "" {
w.Header().Set("Content-Type", mtype)
if storage.IsGzippable(ext, mtype) {
}
if n.NameSize > 0 {
w.Header().Set("Content-Disposition", "filename="+string(n.Name))
}
if ext != ".gz" {
if n.IsGzipped() {
if strings.Contains(r.Header.Get("Accept-Encoding"), "gzip") {
w.Header().Set("Content-Encoding", "gzip")
} else {
@ -140,6 +158,7 @@ func GetHandler(w http.ResponseWriter, r *http.Request) {
}
}
}
w.Header().Set("Content-Length", strconv.Itoa(len(n.Data)))
w.Write(n.Data)
}
func PostHandler(w http.ResponseWriter, r *http.Request) {

3
weed-fs/src/pkg/storage/compress.go

@ -15,6 +15,9 @@ func IsGzippable(ext, mtype string) bool {
if ext == ".rar" {
return false
}
if ext == ".gz" {
return false
}
if strings.Index(mtype,"text/")==0 {
return true
}

33
weed-fs/src/pkg/storage/needle.go

@ -17,9 +17,9 @@ const (
)
type Needle struct {
Cookie uint32 "random number to mitigate brute force lookups"
Id uint64 "needle id"
Size uint32 "sum of DataSize,Data,NameSize,Name,MimeSize,Mime"
Cookie uint32 "random number to mitigate brute force lookups"
Id uint64 "needle id"
Size uint32 "sum of DataSize,Data,NameSize,Name,MimeSize,Mime"
DataSize uint32 "Data size" //version2
Data []byte "The actual file data"
@ -50,15 +50,32 @@ func NewNeedle(r *http.Request) (n *Needle, fname string, e error) {
}
fname = part.FileName()
data, _ := ioutil.ReadAll(part)
//log.Println("uploading file " + part.FileName())
dotIndex := strings.LastIndex(fname, ".")
ext, mtype := "", ""
if dotIndex > 0 {
ext := fname[dotIndex:]
mtype := mime.TypeByExtension(ext)
if IsGzippable(ext, mtype) {
data = GzipData(data)
ext = fname[dotIndex:]
mtype = mime.TypeByExtension(ext)
}
contentType := part.Header.Get("Content-Type")
if contentType != "" && mtype != contentType && len(contentType) < 256 {
n.Mime = []byte(contentType)
mtype = contentType
}
if IsGzippable(ext, mtype) {
data = GzipData(data)
n.SetGzipped()
}
if ext == ".gz" {
n.SetGzipped()
}
if len(fname) < 256 {
if strings.HasSuffix(fname, ".gz") {
n.Name = []byte(fname[:len(fname)-3])
} else {
n.Name = []byte(fname)
}
}
n.Data = data
n.Checksum = NewCRC(data)

7
weed-fs/src/pkg/storage/needle_read_write.go

@ -142,3 +142,10 @@ func (n *Needle) ReadNeedleBody(r *os.File, version Version, bodyLength uint32)
}
return
}
func (n *Needle) IsGzipped() bool{
return n.Flags & 0x01 == 0x01
}
func (n *Needle) SetGzipped(){
n.Flags = n.Flags | 0x01
}
Loading…
Cancel
Save