Finish the PUT method of webdav.

This commit is contained in:
zicla
2019-04-22 00:40:31 +08:00
parent ee9b049db4
commit 8632d7686b
5 changed files with 50 additions and 14 deletions

View File

@ -50,7 +50,7 @@ type Owner struct {
}
func ReadLockInfo(r io.Reader) (li LockInfo, status int, err error) {
c := &CountingReader{r: r}
c := &CountingReader{reader: r}
if err = ixml.NewDecoder(c).Decode(&li); err != nil {
if err == io.EOF {
if c.n == 0 {
@ -72,12 +72,12 @@ func ReadLockInfo(r io.Reader) (li LockInfo, status int, err error) {
//这是一个带字节计数器的Reader可以知道总共读取了多少个字节。
type CountingReader struct {
n int
r io.Reader
n int
reader io.Reader
}
func (c *CountingReader) Read(p []byte) (int, error) {
n, err := c.r.Read(p)
n, err := c.reader.Read(p)
c.n += n
return n, err
}
@ -178,8 +178,8 @@ type Propfind struct {
}
//从request中读出需要的属性。比如getcontentlength 大小 creationdate 创建时间
func ReadPropfind(r io.Reader) (propfind Propfind, status int, err error) {
c := CountingReader{r: r}
func ReadPropfind(reader io.Reader) (propfind Propfind, status int, err error) {
c := CountingReader{reader: reader}
if err = ixml.NewDecoder(&c).Decode(&propfind); err != nil {
if err == io.EOF {
if c.n == 0 {

View File

@ -2,7 +2,6 @@ package rest
import (
"fmt"
"io/ioutil"
"net/http"
"regexp"
)
@ -139,11 +138,7 @@ func (this *DavController) Index(writer http.ResponseWriter, request *http.Reque
}
fmt.Printf("\n------Body------\n")
body, err := ioutil.ReadAll(request.Body)
if err != nil {
fmt.Println("读取body时出错" + err.Error())
}
fmt.Println(string(body))
//ioutil.ReadAll 不可重复读,第二次读的时候就什么都没有了。
fmt.Println("------------------")
@ -152,6 +147,7 @@ func (this *DavController) Index(writer http.ResponseWriter, request *http.Reque
method := request.Method
if method == "PROPFIND" {
//列出文件夹或者目录详情
this.davService.HandlePropfind(writer, request, user, subPath)
@ -159,6 +155,10 @@ func (this *DavController) Index(writer http.ResponseWriter, request *http.Reque
//请求文件详情(下载)
this.davService.HandleGet(writer, request, user, subPath)
} else if method == "PUT" {
//上传文件
this.davService.HandlePut(writer, request, user, subPath)
} else if method == "DELETE" {
//删除文件
this.davService.HandleDelete(writer, request, user, subPath)

View File

@ -226,6 +226,26 @@ func (this *DavService) HandleGet(writer http.ResponseWriter, request *http.Requ
}
//上传文件
func (this *DavService) HandlePut(writer http.ResponseWriter, request *http.Request, user *User, subPath string) {
fmt.Printf("PUT %s\n", subPath)
filename := GetFilenameOfPath(subPath)
dirPath := GetDirOfPath(subPath)
//寻找符合条件的matter.
var matter *Matter
//如果是空或者/就是请求根目录
if dirPath == "" || dirPath == "/" {
matter = NewRootMatter(user)
} else {
matter = this.matterDao.checkByUserUuidAndPath(user.Uuid, dirPath)
}
this.matterService.Upload(request.Body, user, matter.Uuid, filename, true, false)
}
//删除文件
func (this *DavService) HandleDelete(writer http.ResponseWriter, request *http.Request, user *User, subPath string) {

View File

@ -133,7 +133,7 @@ func (this *MatterService) Detail(uuid string) *Matter {
//开始上传文件
//上传文件. alien表明文件是否是应用使用的文件。
func (this *MatterService) Upload(file multipart.File, user *User, puuid string, filename string, privacy bool, alien bool) *Matter {
func (this *MatterService) Upload(file io.Reader, user *User, puuid string, filename string, privacy bool, alien bool) *Matter {
//文件名不能太长。
if len(filename) > 200 {
@ -172,7 +172,7 @@ func (this *MatterService) Upload(file multipart.File, user *User, puuid string,
fileRelativePath := dirRelativePath + "/" + filename
//创建父文件夹
MakeDirAll(fileAbsolutePath)
MakeDirAll(dirAbsolutePath)
//如果文件已经存在了,那么直接覆盖。
exist, err := PathExists(fileAbsolutePath)
@ -194,6 +194,8 @@ func (this *MatterService) Upload(file multipart.File, user *User, puuid string,
written, err := io.Copy(distFile, file)
this.PanicError(err)
this.logger.Info("上传文件%s大小为%v", filename, HumanFileSize(written))
//判断用户自身上传大小的限制。
if user.SizeLimit >= 0 {
if written > user.SizeLimit {

View File

@ -106,6 +106,20 @@ func GetDirOfPath(fullPath string) string {
return fullPath[:index]
}
//获取到一个Path 中的文件名eg /var/www/xx.log -> xx.log
func GetFilenameOfPath(fullPath string) string {
index1 := strings.LastIndex(fullPath, "/")
//可能是windows的环境
index2 := strings.LastIndex(fullPath, "\\")
index := index1
if index2 > index1 {
index = index2
}
return fullPath[index+1:]
}
//尝试删除空文件夹 true表示删掉了一个空文件夹false表示没有删掉任何东西
func DeleteEmptyDir(dirPath string) bool {
dir, err := ioutil.ReadDir(dirPath)