mirror of https://gitee.com/godoos/godoos.git
5 changed files with 219 additions and 118 deletions
@ -0,0 +1,134 @@ |
|||
package files |
|||
|
|||
import ( |
|||
"encoding/json" |
|||
"fmt" |
|||
"godo/libs" |
|||
"io" |
|||
"log" |
|||
"net/http" |
|||
"os" |
|||
"path/filepath" |
|||
) |
|||
|
|||
// 定义结构体来匹配 JSON 数据结构
|
|||
type CallbackData struct { |
|||
Key string `json:"key"` |
|||
Status int `json:"status"` |
|||
URL string `json:"url"` |
|||
ChangesURL string `json:"changesurl"` |
|||
History struct { |
|||
ServerVersion string `json:"serverVersion"` |
|||
Changes []struct { |
|||
DocumentSHA256 string `json:"documentSha256"` |
|||
Created string `json:"created"` |
|||
User struct { |
|||
ID string `json:"id"` |
|||
Name string `json:"name"` |
|||
} `json:"user"` |
|||
} `json:"changes"` |
|||
} `json:"history"` |
|||
Users []string `json:"users"` |
|||
Actions []struct { |
|||
Type int `json:"type"` |
|||
UserID string `json:"userid"` |
|||
} `json:"actions"` |
|||
LastSave string `json:"lastsave"` |
|||
NotModified bool `json:"notmodified"` |
|||
FileType string `json:"filetype"` |
|||
} |
|||
|
|||
// 定义 OnlyOffice 预期的响应结构
|
|||
type OnlyOfficeResponse struct { |
|||
Error int `json:"error"` |
|||
} |
|||
|
|||
// OnlyOffice 回调处理函数
|
|||
func OnlyOfficeCallbackHandler(w http.ResponseWriter, r *http.Request) { |
|||
// 读取请求体
|
|||
body, err := io.ReadAll(r.Body) |
|||
if err != nil { |
|||
http.Error(w, "Failed to read request body", http.StatusBadRequest) |
|||
return |
|||
} |
|||
defer r.Body.Close() |
|||
|
|||
// 打印原始请求体
|
|||
fmt.Printf("Received raw data: %s\n", body) |
|||
|
|||
// 解析 JSON 数据
|
|||
var callbackData CallbackData |
|||
err = json.Unmarshal(body, &callbackData) |
|||
if err != nil { |
|||
http.Error(w, "Failed to decode request body", http.StatusBadRequest) |
|||
return |
|||
} |
|||
|
|||
// 打印解析后的回调数据
|
|||
fmt.Printf("Received callback: %+v\n", callbackData) |
|||
|
|||
// 使用 key 查找对应的 path
|
|||
mapOnlyOfficeMutex.Lock() |
|||
path, exists := OnlyOfficekeyPathMap[callbackData.Key] |
|||
if exists { |
|||
delete(OnlyOfficekeyPathMap, callbackData.Key) // 删除已使用的 key
|
|||
if callbackData.Status == 2 { |
|||
err := downloadFile(path, callbackData.URL) |
|||
log.Printf("Download file error: %v", err) |
|||
if err != nil { |
|||
http.Error(w, fmt.Sprintf("Failed to download file: %v", err), http.StatusInternalServerError) |
|||
return |
|||
} |
|||
} |
|||
} |
|||
mapOnlyOfficeMutex.Unlock() |
|||
// 构造响应
|
|||
response := OnlyOfficeResponse{ |
|||
Error: 0, |
|||
} |
|||
|
|||
// 设置响应头为 JSON 格式
|
|||
w.Header().Set("Content-Type", "application/json") |
|||
|
|||
// 返回 JSON 响应
|
|||
json.NewEncoder(w).Encode(response) |
|||
} |
|||
|
|||
// 下载文件
|
|||
func downloadFile(filePath string, url string) error { |
|||
resp, err := http.Get(url) |
|||
if err != nil { |
|||
return err |
|||
} |
|||
defer resp.Body.Close() |
|||
basePath, err := libs.GetOsDir() |
|||
if err != nil { |
|||
return err |
|||
} |
|||
fullFilePath := filepath.Join(basePath, filePath) |
|||
// 使用 os.OpenFile 创建或截断文件
|
|||
out, err := os.OpenFile(fullFilePath, os.O_CREATE|os.O_WRONLY|os.O_TRUNC, 0666) |
|||
if err != nil { |
|||
return err |
|||
} |
|||
defer out.Close() |
|||
// 获取文件密钥
|
|||
fileSecret := libs.GetConfigString("filePwd") |
|||
if fileSecret != "" { |
|||
// 读取文件内容到内存中
|
|||
fileBytes, err := io.ReadAll(resp.Body) |
|||
if err != nil { |
|||
return err |
|||
} |
|||
encryData, err := libs.EncodeFile(fileSecret, string(fileBytes)) |
|||
if err != nil { |
|||
return err |
|||
} |
|||
_, err = out.Write([]byte(encryData)) |
|||
return err |
|||
} else { |
|||
_, err = io.Copy(out, resp.Body) |
|||
return err |
|||
} |
|||
|
|||
} |
Loading…
Reference in new issue