diff --git a/weed/server/filer_server_handlers_read.go b/weed/server/filer_server_handlers_read.go index 6c71c475e..a455ac22a 100644 --- a/weed/server/filer_server_handlers_read.go +++ b/weed/server/filer_server_handlers_read.go @@ -1,20 +1,29 @@ package weed_server import ( + "bytes" + "fmt" "io" + "io/ioutil" "net/http" "net/url" + "path" "strconv" "strings" "github.com/chrislusf/seaweedfs/weed/filer" "github.com/chrislusf/seaweedfs/weed/glog" "github.com/chrislusf/seaweedfs/weed/operation" + "github.com/chrislusf/seaweedfs/weed/security" ui "github.com/chrislusf/seaweedfs/weed/server/filer_ui" "github.com/chrislusf/seaweedfs/weed/util" "github.com/syndtr/goleveldb/leveldb" ) +//文件服务器地址 +var fileUrl string = "http://127.0.0.1:8888" +var resourceUrl string = "http://resource.k12cloud.cn" + // listDirectoryHandler lists directories and folers under a directory // files are sorted by name and paginated via "lastFileName" and "limit". // sub directories are listed on the first page, when "lastFileName" @@ -87,11 +96,29 @@ func (fs *FilerServer) GetOrHeadHandler(w http.ResponseWriter, r *http.Request, return } + //先在文件存储中查找该文件是否存在,不存在则去七牛查找,下载并上传到文件存储中 + fileId, err := fs.filer.FindFile(r.URL.Path) + if err == filer.ErrNotFound { + data, fileName, contentType, err := download(resourceUrl + r.URL.Path) + if err != nil { + glog.V(0).Infoln(err) + return + } + + jwt := security.GetJwt(r) + _, err = operation.Upload(fileUrl+r.URL.Path, fileName, bytes.NewReader(data), false, contentType, jwt) + if err != nil { + glog.V(0).Infoln(err) + return + } + glog.V(0).Infoln("path", resourceUrl+r.URL.Path) + } + reqUrl := r.URL.RequestURI() if r.FormValue("w") != "" || r.FormValue("h") != "" || r.FormValue("r") != "" { reqUrl = r.URL.Path + "?w=" + r.FormValue("w") + "&h=" + r.FormValue("h") + "&r=" + r.FormValue("r") } - fileId, err := fs.filer.FindFile(reqUrl) + fileId, err = fs.filer.FindFile(reqUrl) if err == filer.ErrNotFound { glog.V(0).Infoln(reqUrl, "not exist") r.Header.Add("exist", "0") @@ -152,3 +179,35 @@ func (fs *FilerServer) GetOrHeadHandler(w http.ResponseWriter, r *http.Request, io.Copy(w, resp.Body) } + +func download(u string) (data []byte, fileName, contentType string, err error) { + client := &http.Client{} + request, err := http.NewRequest("GET", u, nil) + if err != nil { + return + } + + resp, err := client.Do(request) + if err != nil { + return + } + defer resp.Body.Close() + + if resp.StatusCode != 200 { + err = fmt.Errorf("%s", "下载失败") + } + data, err = ioutil.ReadAll(resp.Body) + if err != nil { + return + } + + contentType = resp.Header.Get("Content-type") + + ur, err := url.Parse(u) + if err != nil { + return + } + _, fileName = path.Split(ur.Path) + + return +} diff --git a/weed/server/volume_server_handlers_read.go b/weed/server/volume_server_handlers_read.go index f878966a2..05631a515 100644 --- a/weed/server/volume_server_handlers_read.go +++ b/weed/server/volume_server_handlers_read.go @@ -145,7 +145,7 @@ func (vs *VolumeServer) GetOrHeadHandler(w http.ResponseWriter, r *http.Request) reqUrl := r.Header.Get("path") + "?w=" + r.FormValue("w") + "&h=" + r.FormValue("h") + "&r=" + r.FormValue("r") jwt := security.GetJwt(r) - _, err = operation.Upload("http://121.41.99.232:50001"+reqUrl, filename, bytes.NewReader(n.Data), false, "image/jpeg", jwt) + _, err = operation.Upload(fileUrl+reqUrl, filename, bytes.NewReader(n.Data), false, "image/jpeg", jwt) if err != nil { glog.V(0).Infoln(err) } diff --git a/weed/weed b/weed/weed index a054f3908..2d6fe7ceb 100755 Binary files a/weed/weed and b/weed/weed differ diff --git a/weed/weed_linux_amd64 b/weed/weed_linux_amd64 index 49c3cebd4..b0f7b6ad3 100755 Binary files a/weed/weed_linux_amd64 and b/weed/weed_linux_amd64 differ