| @@ -27,6 +27,7 @@ type File struct { | |||||
| Size int64 `json:"size"` | Size int64 `json:"size"` | ||||
| CreatedTime string `xorm:"varchar(100)" json:"createdTime"` | CreatedTime string `xorm:"varchar(100)" json:"createdTime"` | ||||
| IsLeaf bool `json:"isLeaf"` | IsLeaf bool `json:"isLeaf"` | ||||
| Url string `xorm:"varchar(255)" json:"url"` | |||||
| Children []*File `xorm:"varchar(1000)" json:"children"` | Children []*File `xorm:"varchar(1000)" json:"children"` | ||||
| ChildrenMap map[string]*File `xorm:"-" json:"-"` | ChildrenMap map[string]*File `xorm:"-" json:"-"` | ||||
| @@ -21,7 +21,7 @@ import ( | |||||
| "github.com/casbin/casibase/storage" | "github.com/casbin/casibase/storage" | ||||
| ) | ) | ||||
| func (store *Store) createPathIfNotExisted(tokens []string, size int64, lastModifiedTime string, isLeaf bool) { | |||||
| func (store *Store) createPathIfNotExisted(tokens []string, size int64, url string, lastModifiedTime string, isLeaf bool) { | |||||
| currentFile := store.FileTree | currentFile := store.FileTree | ||||
| for i, token := range tokens { | for i, token := range tokens { | ||||
| if currentFile.Children == nil { | if currentFile.Children == nil { | ||||
| @@ -47,6 +47,7 @@ func (store *Store) createPathIfNotExisted(tokens []string, size int64, lastModi | |||||
| Key: key, | Key: key, | ||||
| Title: token, | Title: token, | ||||
| IsLeaf: isLeafTmp, | IsLeaf: isLeafTmp, | ||||
| Url: url, | |||||
| Children: []*File{}, | Children: []*File{}, | ||||
| ChildrenMap: map[string]*File{}, | ChildrenMap: map[string]*File{}, | ||||
| } | } | ||||
| @@ -90,6 +91,7 @@ func (store *Store) Populate() error { | |||||
| Title: store.DisplayName, | Title: store.DisplayName, | ||||
| CreatedTime: store.CreatedTime, | CreatedTime: store.CreatedTime, | ||||
| IsLeaf: false, | IsLeaf: false, | ||||
| Url: "", | |||||
| Children: []*File{}, | Children: []*File{}, | ||||
| ChildrenMap: map[string]*File{}, | ChildrenMap: map[string]*File{}, | ||||
| } | } | ||||
| @@ -111,9 +113,10 @@ func (store *Store) Populate() error { | |||||
| lastModifiedTime := object.LastModified | lastModifiedTime := object.LastModified | ||||
| isLeaf := isObjectLeaf(object) | isLeaf := isObjectLeaf(object) | ||||
| size := object.Size | size := object.Size | ||||
| url := object.Url | |||||
| tokens := strings.Split(strings.Trim(object.Key, "/"), "/") | tokens := strings.Split(strings.Trim(object.Key, "/"), "/") | ||||
| store.createPathIfNotExisted(tokens, size, lastModifiedTime, isLeaf) | |||||
| store.createPathIfNotExisted(tokens, size, url, lastModifiedTime, isLeaf) | |||||
| // fmt.Printf("%s, %d, %v\n", object.Key, object.Size, object.LastModified) | // fmt.Printf("%s, %d, %v\n", object.Key, object.Size, object.LastModified) | ||||
| } | } | ||||
| @@ -20,9 +20,7 @@ import ( | |||||
| "io" | "io" | ||||
| "net/http" | "net/http" | ||||
| "github.com/astaxie/beego" | |||||
| "github.com/casbin/casibase/casdoor" | "github.com/casbin/casibase/casdoor" | ||||
| "github.com/casbin/casibase/util" | |||||
| "github.com/casdoor/casdoor-go-sdk/casdoorsdk" | "github.com/casdoor/casdoor-go-sdk/casdoorsdk" | ||||
| ) | ) | ||||
| @@ -66,8 +64,7 @@ func GetObject(provider string, key string) (io.ReadCloser, error) { | |||||
| } | } | ||||
| func PutObject(provider string, key string, fileBuffer *bytes.Buffer) error { | func PutObject(provider string, key string, fileBuffer *bytes.Buffer) error { | ||||
| _, _, err := casdoorsdk.UploadResource("Casibase", "Casibase", "Casibase", | |||||
| fmt.Sprintf("/casibase/%s", key), fileBuffer.Bytes()) | |||||
| _, _, err := casdoorsdk.UploadResource("Casibase", "", "", fmt.Sprintf("Direct/%s/%s", provider, key), fileBuffer.Bytes()) | |||||
| if err != nil { | if err != nil { | ||||
| return err | return err | ||||
| } | } | ||||
| @@ -75,8 +72,7 @@ func PutObject(provider string, key string, fileBuffer *bytes.Buffer) error { | |||||
| } | } | ||||
| func DeleteObject(provider string, key string) error { | func DeleteObject(provider string, key string) error { | ||||
| casdoorOrganization := beego.AppConfig.String("casdoorOrganization") | |||||
| _, err := casdoorsdk.DeleteResource(util.GetIdFromOwnerAndName(casdoorOrganization, fmt.Sprintf("/casibase/%s", key))) | |||||
| _, err := casdoorsdk.DeleteResource(fmt.Sprintf("Direct/%s/%s", provider, key)) | |||||
| if err != nil { | if err != nil { | ||||
| return err | return err | ||||
| } | } | ||||
| @@ -207,8 +207,7 @@ class FileTable extends React.Component { | |||||
| {text} | {text} | ||||
| <Button icon={<DownloadOutlined />} style={{marginLeft: "20px", marginRight: "10px"}} type="primary" size="small" onClick={() => { | <Button icon={<DownloadOutlined />} style={{marginLeft: "20px", marginRight: "10px"}} type="primary" size="small" onClick={() => { | ||||
| files.filter(file => file.isLeaf).forEach((file, index) => { | files.filter(file => file.isLeaf).forEach((file, index) => { | ||||
| const url = `${this.props.store.domain}/${file.key}`; | |||||
| Setting.openLink(url); | |||||
| Setting.openLink(file.url); | |||||
| }); | }); | ||||
| }}>{i18next.t("store:Download")}</Button> | }}>{i18next.t("store:Download")}</Button> | ||||
| <Popconfirm | <Popconfirm | ||||
| @@ -341,7 +341,7 @@ class FileTree extends React.Component { | |||||
| const path = selectedKeys[0]; | const path = selectedKeys[0]; | ||||
| const ext = Setting.getExtFromPath(path); | const ext = Setting.getExtFromPath(path); | ||||
| if (ext !== "") { | if (ext !== "") { | ||||
| const url = `${store.domain}/${path}`; | |||||
| const url = info.node.url; | |||||
| if (!this.isExtForDocViewer((ext) && !this.isExtForFileViewer(ext))) { | if (!this.isExtForDocViewer((ext) && !this.isExtForFileViewer(ext))) { | ||||
| this.setState({ | this.setState({ | ||||
| @@ -443,8 +443,7 @@ class FileTree extends React.Component { | |||||
| <Tooltip title={i18next.t("store:Download")}> | <Tooltip title={i18next.t("store:Download")}> | ||||
| <Button style={{marginRight: "5px"}} icon={<DownloadOutlined />} size="small" onClick={(e) => { | <Button style={{marginRight: "5px"}} icon={<DownloadOutlined />} size="small" onClick={(e) => { | ||||
| Setting.showMessage("success", "Successfully downloaded"); | Setting.showMessage("success", "Successfully downloaded"); | ||||
| const url = `${store.domain}/${file.key}`; | |||||
| Setting.openLink(url); | |||||
| Setting.openLink(file.url); | |||||
| e.stopPropagation(); | e.stopPropagation(); | ||||
| }} /> | }} /> | ||||
| </Tooltip> | </Tooltip> | ||||
| @@ -671,7 +670,7 @@ class FileTree extends React.Component { | |||||
| } | } | ||||
| const ext = Setting.getExtFromPath(path); | const ext = Setting.getExtFromPath(path); | ||||
| const url = `${store.domain}/${path}`; | |||||
| const url = this.state.selectedFile.url; | |||||
| const app = this.getCacheApp(filename); | const app = this.getCacheApp(filename); | ||||
| if (app !== "") { | if (app !== "") { | ||||