yuan_rh 4 роки тому
джерело
коміт
72ce760fca
2 змінених файлів з 76 додано та 45 видалено
  1. +72
    -40
      handle/handle.go
  2. +4
    -5
      websocket/websocket.go

+ 72
- 40
handle/handle.go Переглянути файл

@@ -27,7 +27,10 @@ var gobalFileUpdateTimeMap = make(map[string] string)
var getLocalFileListDir string var getLocalFileListDir string
var gobalSubscriptionFileChangeSwitch int =0 //订阅文件变更开关 var gobalSubscriptionFileChangeSwitch int =0 //订阅文件变更开关


var ipfsPath=os.Getenv("IPFS-PATH")+"ipfs.exe"


var ipfsPath=os.Getenv("IPFS-PATH")

/** /**
文件上传下载进度 文件上传下载进度
*/ */
@@ -40,6 +43,8 @@ type processStruct struct {
} }


func main() { func main() {


//config.InitConfig() //config.InitConfig()
//InitLocalWorkSpace("320872793405132801","test1") //InitLocalWorkSpace("320872793405132801","test1")
// //
@@ -59,6 +64,9 @@ func main() {
*/ */
func InitLocalWorkSpace(conn *websocket.Conn,userId,projectName string) (error){ func InitLocalWorkSpace(conn *websocket.Conn,userId,projectName string) (error){


//空格路径处理
ipfsPath=strings.Replace(os.Getenv("IPFS-PATH"),"\"","",1)+"\\ipfs.exe"

//初始化当前登陆用户 //初始化当前登陆用户
gobalLoginUserId = userId gobalLoginUserId = userId


@@ -105,6 +113,7 @@ func DownCommand(conn *websocket.Conn, hash, projectName, fileName, dir string)
} }
} }


var downloading bool = false


cmd := exec.Command(ipfsPath,"get", hash,"-o",fmt.Sprint(absoluteDir+"\\"+fileName)) cmd := exec.Command(ipfsPath,"get", hash,"-o",fmt.Sprint(absoluteDir+"\\"+fileName))
progress := make(chan string,10000) progress := make(chan string,10000)
@@ -121,10 +130,10 @@ func DownCommand(conn *websocket.Conn, hash, projectName, fileName, dir string)
}() }()


go func(){ go func(){
seconds := time.Now().Unix()
millSeconds := time.Now().UnixNano() / 1e6
for content := range progress { // 通道关闭后会退出for range循环 for content := range progress { // 通道关闭后会退出for range循环
current :=time.Now().Unix()
if current-seconds>1{
current :=time.Now().UnixNano() / 1e6
if current-millSeconds>500{
projson,err := contentToJSONByte(content) projson,err := contentToJSONByte(content)
if projson==nil && err==nil{ if projson==nil && err==nil{
continue continue
@@ -133,11 +142,12 @@ func DownCommand(conn *websocket.Conn, hash, projectName, fileName, dir string)
if err != nil { if err != nil {
log.Printf("json.Marshal error %s\n", err) log.Printf("json.Marshal error %s\n", err)
} }
downloading = true
if err := conn.WriteMessage(websocket.TextMessage, projson); err != nil { if err := conn.WriteMessage(websocket.TextMessage, projson); err != nil {
log.Println(err) log.Println(err)
break break
} }
seconds = current
millSeconds = current
} }
if strings.Index(content,"100.00%")!=-1{ if strings.Index(content,"100.00%")!=-1{


@@ -149,6 +159,7 @@ func DownCommand(conn *websocket.Conn, hash, projectName, fileName, dir string)
if err != nil { if err != nil {
log.Printf("json.Marshal error %s\n", err) log.Printf("json.Marshal error %s\n", err)
} }
downloading = true
if err := conn.WriteMessage(websocket.TextMessage, projson); err != nil { if err := conn.WriteMessage(websocket.TextMessage, projson); err != nil {
panic(err) panic(err)
} }
@@ -163,18 +174,17 @@ func DownCommand(conn *websocket.Conn, hash, projectName, fileName, dir string)
go func() { go func() {
index :=0 index :=0
for true{ for true{
if cmd.ProcessState==nil{
index++
time.Sleep(time.Duration(1)*time.Second)
if index==30{
err = cmd.Process.Kill()
log.Println("进程连接超时30s已被Kill")
if err := conn.WriteMessage(websocket.TextMessage, []byte("-1")); err != nil {
return
}
index++
if downloading==true{
return
}
time.Sleep(time.Duration(1)*time.Second)
if downloading==false && index==30{
err = cmd.Process.Kill()
log.Println("进程连接超时30s已被Kill")
if err := conn.WriteMessage(websocket.TextMessage, []byte("-1")); err != nil {
return return
} }
}else {
return return
} }
} }
@@ -182,7 +192,7 @@ func DownCommand(conn *websocket.Conn, hash, projectName, fileName, dir string)


err = cmd.Wait() err = cmd.Wait()
if err != nil { if err != nil {
log.Panicf("cmd.Run() failed with %s\n", err)
log.Printf("cmd.Run() failed with %s\n", err)
} }
if errStdout != nil || errStderr != nil { if errStdout != nil || errStderr != nil {
log.Printf("failed to capture stdout or stderr\n") log.Printf("failed to capture stdout or stderr\n")
@@ -239,22 +249,6 @@ func contentToJSONByte(content string) ([]byte,error){
@param dir 云文件目录 @param dir 云文件目录
*/ */
func UploadCommand(conn *websocket.Conn,absolutePath,fileName,projectName,dir string) error{ func UploadCommand(conn *websocket.Conn,absolutePath,fileName,projectName,dir string) error{
//拷贝文件

//上传文件

//
//file,err :=os.Open(absolutePath)
//if err != nil{
// return "",err
//}
//
//defer file.Close()
//
//hash,err :=sh.Add(file)
//if err != nil {
// return "",err
//}


//本地拷贝文件 //本地拷贝文件
absoluteDir := config.LocalWorkSpaceDir+"\\"+gobalLoginUserId+"\\"+projectName+"\\"+dir absoluteDir := config.LocalWorkSpaceDir+"\\"+gobalLoginUserId+"\\"+projectName+"\\"+dir
@@ -268,6 +262,18 @@ func UploadCommand(conn *websocket.Conn,absolutePath,fileName,projectName,dir st
} }
} }


//检测文件打开状态
_,err = os.OpenFile(absolutePath,os.O_RDWR,1)
if err != nil {
log.Println("文件被占用,请关闭打开的软件")
if err := conn.WriteMessage(websocket.TextMessage, []byte("-2")); err != nil {
return err
}
return err
}

var uploading bool=false

cmd := exec.Command(ipfsPath, "add",absolutePath) cmd := exec.Command(ipfsPath, "add",absolutePath)
uploadProgress := make(chan string,10000) uploadProgress := make(chan string,10000)
var stdout, stderr []byte var stdout, stderr []byte
@@ -283,22 +289,23 @@ func UploadCommand(conn *websocket.Conn,absolutePath,fileName,projectName,dir st
}() }()


go func(){ go func(){
seconds := time.Now().Unix()
millSeconds := time.Now().UnixNano() / 1e6
for content := range uploadProgress { // 通道关闭后会退出for range循环 for content := range uploadProgress { // 通道关闭后会退出for range循环
current :=time.Now().Unix()
if current-seconds>1{
current :=time.Now().UnixNano() / 1e6
if current-millSeconds>500{
projson,err := contentToJSONByte(content) projson,err := contentToJSONByte(content)
if projson==nil && err==nil{ if projson==nil && err==nil{
continue continue
} }


if err != nil { if err != nil {
log.Fatalf("json.Marshal error %s\n", err)
log.Println("json.Marshal error %s\n", err)
} }
uploading=true
if err := conn.WriteMessage(websocket.TextMessage, projson); err != nil { if err := conn.WriteMessage(websocket.TextMessage, projson); err != nil {
break break
} }
seconds = current
millSeconds = current
} }
if strings.Index(content,"100.00%")!=-1{ if strings.Index(content,"100.00%")!=-1{


@@ -309,8 +316,9 @@ func UploadCommand(conn *websocket.Conn,absolutePath,fileName,projectName,dir st




if err != nil { if err != nil {
log.Fatalf("json.Marshal error %s\n", err)
log.Println("json.Marshal error %s\n", err)
} }
uploading=true
if err := conn.WriteMessage(websocket.TextMessage, projson); err != nil { if err := conn.WriteMessage(websocket.TextMessage, projson); err != nil {
panic(err) panic(err)
} }
@@ -319,13 +327,35 @@ func UploadCommand(conn *websocket.Conn,absolutePath,fileName,projectName,dir st
} }
}() }()


log.Println("文件上传中...")

//设置30秒连接超时
go func() {
index :=0
for true{
index++
if uploading==true{
return
}
time.Sleep(time.Duration(1)*time.Second)
if uploading==false && index==30{
err = cmd.Process.Kill()
log.Println("进程连接超时30s已被Kill")
if err := conn.WriteMessage(websocket.TextMessage, []byte("-1")); err != nil {
return
}
return
}
}
}()

err = cmd.Wait() err = cmd.Wait()


if err != nil { if err != nil {
log.Fatalf("cmd.Run() failed with %s\n", err)
log.Println("cmd.Run() failed with %s\n", err)
} }
if errStdout != nil || errStderr != nil { if errStdout != nil || errStderr != nil {
log.Fatalf("failed to capture stdout or stderr\n")
log.Println("failed to capture stdout or stderr\n")
} }
outStr, errStr := string(stdout), string(stderr) outStr, errStr := string(stdout), string(stderr)
log.Printf("out:%s,err:%s", outStr, errStr) log.Printf("out:%s,err:%s", outStr, errStr)
@@ -432,6 +462,7 @@ func SubscriptionFileChange(conn *websocket.Conn, projectName string) error{


if err := conn.WriteMessage(websocket.TextMessage, mapByte); err != nil { if err := conn.WriteMessage(websocket.TextMessage, mapByte); err != nil {
log.Println(err) log.Println(err)
return err
} }


log.Println("检查本地目录文件变更状态,执行睡眠时间1分钟") log.Println("检查本地目录文件变更状态,执行睡眠时间1分钟")
@@ -451,6 +482,7 @@ func walkfunc(path string, info os.FileInfo, err error) error {


sh := shell.NewShell(config.GobalIpfsUrl) sh := shell.NewShell(config.GobalIpfsUrl)
file,err :=os.Open(path) file,err :=os.Open(path)

if err != nil{ if err != nil{
log.Println(err) log.Println(err)
return err return err


+ 4
- 5
websocket/websocket.go Переглянути файл

@@ -1,7 +1,6 @@
package websocket package websocket


import ( import (
"fmt"
"fts/handle" "fts/handle"
"github.com/gorilla/websocket" "github.com/gorilla/websocket"
"log" "log"
@@ -46,7 +45,7 @@ func UploadHandler(w http.ResponseWriter, r *http.Request) {
params :=strings.Split(string(data),"|") params :=strings.Split(string(data),"|")
err := handle.UploadCommand(conn,params[0],params[1],params[2],params[3]) err := handle.UploadCommand(conn,params[0],params[1],params[2],params[3])
if err!=nil{ if err!=nil{
fmt.Println(err)
log.Println(err)
goto ERR goto ERR
} }
goto ERR goto ERR
@@ -84,7 +83,7 @@ func DownloadHandler(w http.ResponseWriter, r *http.Request) {
params :=strings.Split(string(data),"|") params :=strings.Split(string(data),"|")
err := handle.DownCommand(conn,params[0],params[1],params[2],params[3]) err := handle.DownCommand(conn,params[0],params[1],params[2],params[3])
if err!=nil{ if err!=nil{
fmt.Println(err)
log.Println(err)
goto ERR goto ERR
} }


@@ -123,7 +122,7 @@ func InitLocalWorkSpaceHandler(w http.ResponseWriter, r *http.Request) {
params :=strings.Split(string(data),"|") params :=strings.Split(string(data),"|")
err := handle.InitLocalWorkSpace(conn,params[0],params[1]) err := handle.InitLocalWorkSpace(conn,params[0],params[1])
if err!=nil{ if err!=nil{
fmt.Println(err)
log.Println(err)
goto ERR goto ERR
} }


@@ -162,7 +161,7 @@ func SubscriptionFileChangeHandler(w http.ResponseWriter, r *http.Request){


if err != nil { if err != nil {
//报错了 //报错了
fmt.Println(err)
log.Println(err)
goto ERR goto ERR
} }




Завантаження…
Відмінити
Зберегти