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. 23
      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
}

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

@ -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)
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