zoukankan      html  css  js  c++  java
  • go 文件服务(读取须权限)

     1 package Network
     2 
     3 import (
     4     "encoding/base64"
     5     "encoding/json"
     6     "net/http"
     7     "os"
     8     "strings"
     9     "time"
    10     "token"
    11 )
    12 
    13 func getFile(w http.ResponseWriter, req *http.Request) {
    14     var (
    15         code     int         = Success
    16         msg      string      = ""
    17         result   interface{} = nil
    18         httpCode int         = http.StatusOK
    19     )
    20     defer func() {
    21         w.WriteHeader(httpCode)
    22         if httpCode != http.StatusOK {
    23             writeHTTPResult(w, code, msg, result)
    24         }
    25     }()
    26     Token := req.FormValue("token")
    27     user, ok := token.GetUser(Token)
    28     if !ok {
    29         httpCode = http.StatusForbidden
    30         code = errNoPermission
    31         msg = "token 无效"
    32         return
    33     }
    34 
    35     httpCode, fileInfo, base64FileName := Decode(req)
    36 
    37     if user.ID == fileInfo.ReceiverID || user.ID == fileInfo.SenderID {
    38         httpCode, code, msg = WriteFile(w, req, fileInfo, base64FileName)
    39         return
    40     }
    41 
    42     code, msg = IsGroupID(fileInfo.ReceiverID)
    43     if code != Success {
    44         httpCode = http.StatusForbidden
    45         if code == errInvalidID {
    46             code = errNoPermission
    47             msg = "you have no permission to get this file"
    48         }
    49         return
    50     }
    51 
    52     code, msg = IsGroupMember(user.ID, fileInfo.ReceiverID)
    53     if code != Success {
    54         httpCode = http.StatusForbidden
    55         if code == errInvalidID {
    56             code = errNoPermission
    57             msg = "you have no permission to get this file"
    58         }
    59         return
    60     }
    61 
    62     httpCode, code, msg = WriteFile(w, req, fileInfo, base64FileName)
    63     return
    64 
    65 }
    66 func WriteFile(w http.ResponseWriter, req *http.Request, fileInfo *FileInfo, base64FileName string) (httpCode int, code int, msg string) {
    67     file, err := os.Open(publicFileDir + "/" + fileInfo.FileType + "/" + base64FileName)
    68     if err != nil {
    69         httpCode = http.StatusNotFound
    70         code = errFileNotFound
    71         msg = err.Error()
    72         return
    73     }
    74     defer file.Close()
    75     w.Header().Set("Filename", fileInfo.FileName)
    76     http.ServeContent(w, req, fileInfo.FileName, time.Time{}, file)
    77     return http.StatusOK, Success, ""
    78 }
    79 
    80 func Decode(req *http.Request) (httpCode int, fileInfo *FileInfo, base64FileName string) {
    81     fileInfo = new(FileInfo)
    82     URL := strings.Split(req.URL.Path, "/")
    83     if len(URL) == 0 {
    84         return http.StatusNotFound, nil, base64FileName
    85     }
    86     base64FileName = URL[len(URL)-1]
    87     fileName, err := base64.StdEncoding.DecodeString(base64FileName)
    88     if err != nil {
    89         return http.StatusBadRequest, nil, base64FileName
    90     }
    91     err = json.Unmarshal(fileName, fileInfo)
    92     if err != nil {
    93         return http.StatusForbidden, nil, base64FileName
    94     }
    95     return http.StatusOK, fileInfo, base64FileName
    96 }
    getFile(server)
     1 func getFile(uri string, fileName string) error {
     2     resp, err := http.Get(uri)
     3     if err != nil {
     4         return err
     5     }
     6     defer resp.Body.Close()
     7     if resp.StatusCode != http.StatusOK {
     8         body, err := ioutil.ReadAll(resp.Body)
     9         if err != nil {
    10             return err
    11         }
    12         return errors.New("statusCode:" + fmt.Sprint(resp.StatusCode) + "
    " + string(body))
    13     }
    14     if fileName == "" {
    15         if resp.Header["Filename"] != nil {
    16             fileName = resp.Header["Filename"][0]
    17         } else {
    18             fileName = "notFound"
    19         }
    20     }
    21     icon, err := os.Create(fileName)
    22     if err != nil {
    23         return err
    24     }
    25     _, err = io.Copy(icon, resp.Body)
    26     if err != nil {
    27         return err
    28     }
    29     logs.Print(resp.Header)
    30     return nil
    31 }
    getFile(client)

    这里由于http response的body完全是文件的二进制流,所以Filename要么是前端定义,要么是后端通过header返回

    文件的url是一个base64编码的字符串,包含验证读取权限相关的所有信息和源文件名(服务器存文件时用的是base64编码作为文件名)

  • 相关阅读:
    kvm虚拟机网络管理
    kvm虚拟机存储管理
    kvm虚拟机迁移
    KVM嵌套虚拟化nested之CPU透传
    kvm认识和安装
    博客美化(二)
    日志管理
    IP分为五类
    windows(xshell)免密码登录
    mpvue的toast弹窗组件-mptosat
  • 原文地址:https://www.cnblogs.com/cdyboke/p/6816347.html
Copyright © 2011-2022 走看看