• go 文件上传


     1 func newfileUploadRequest(uri string, form map[string]string, formFileName, path string) error {
     2     file, err := os.Open(path)
     3     if err != nil {
     4         return err
     5     }
     6     defer file.Close()
     7 
     8     body := &bytes.Buffer{}
     9     writer := multipart.NewWriter(body)
    10     part, err := writer.CreateFormFile(formFileName, filepath.Base(path))
    11     if err != nil {
    12         return err
    13     }
    14     _, err = io.Copy(part, file)
    15     if err != nil {
    16         return err
    17     }
    18 
    19     for key, val := range form {
    20         err = writer.WriteField(key, val)
    21         if err != nil {
    22             return err
    23         }
    24     }
    25     err = writer.Close()
    26     if err != nil {
    27         return err
    28     }
    29     req, err := http.NewRequest("POST", uri, body)
    30     req.Header.Add("Content-Type", writer.FormDataContentType())
    31     if err != nil {
    32         return err
    33     }
    34     resp, err := http.DefaultClient.Do(req)
    35     if err != nil {
    36         return err
    37     }
    38     defer resp.Body.Close()
    39     Body, err := ioutil.ReadAll(resp.Body)
    40     if err != nil {
    41         return err
    42     }
    43     fmt.Println(string(Body))
    44     return nil
    45 }
    upload(client)
     1 package Network
     2 
     3 import (
     4     "SQL/myDB"
     5     "fmt"
     6     "io"
     7     "logs"
     8     "mime/multipart"
     9     "net/http"
    10     "os"
    11 )
    12 
    13 const publicFileDir = "./public"
    14 const maxIconSize = 20 << 20
    15 
    16 func alterIcon(w http.ResponseWriter, req *http.Request) {
    17     var (
    18         code   int         = Success
    19         msg    string      = ""
    20         result interface{} = nil
    21     )
    22     defer func() {
    23         writeHTTPResult(w, code, msg, result)
    24     }()
    25     err := req.ParseMultipartForm(32 << 20)
    26     if err != nil {
    27         code = errParseForm
    28         msg = err.Error()
    29         return
    30     }
    31     logs.Print(req.Form)
    32     logs.Print(req.MultipartForm)
    33     token := req.FormValue("token")
    34     code, msg, userID := judgeToken(token)
    35     if code != Success {
    36         return
    37     }
    38     icon, _, err := req.FormFile("icon")
    39     if statInterface, ok := icon.(Stat); ok {
    40         fileInfo, err := statInterface.Stat()
    41         if err == nil {
    42             if fileInfo.Size() > (maxIconSize) {
    43                 code = errParseFileFailed
    44                 msg = fmt.Sprint("上传文件不要超过", maxIconSize>>20, "M")
    45                 return
    46             }
    47         } else if sizeInterface, ok := icon.(Size); ok {
    48             if sizeInterface.Size() > (maxIconSize) {
    49                 code = errParseFileFailed
    50                 msg = fmt.Sprint("上传文件不要超过", maxIconSize>>20, "M")
    51                 return
    52             }
    53         }
    54     }
    55     if err != nil {
    56         code = errParseFileFailed
    57         msg = err.Error()
    58         return
    59     }
    60     defer icon.Close()
    61     code, msg, result = dealAlterIcon(userID, icon)
    62     return
    63 }
    64 func dealAlterIcon(userID string, icon multipart.File) (code int, msg string, result interface{}) {
    65     fileName := "/icon/" + userID + ".ico"
    66     code, msg = saveFile(fileName, icon, publicFileDir, maxIconSize)
    67     if code != Success {
    68         return code, msg, nil
    69     }
    70     err := myDB.ExecSql("update objects set iconURL = $1 where id = $2", fileName, userID)
    71     if err != nil {
    72         return errDBExecFailed, err.Error(), nil
    73     }
    74     return Success, "", map[string]string{"IconURL": fileName}
    75 }
    76 
    77 func saveFile(fileName string, file multipart.File, fileDir string, maxSize int64) (code int, msg string) {
    78     File, err := os.OpenFile(publicFileDir+fileName, os.O_WRONLY|os.O_CREATE, 0666)
    79     if err != nil {
    80         code = errWriteFileFailed
    81         msg = err.Error()
    82         return
    83     }
    84     defer File.Close()
    85     n, err := io.Copy(File, file)
    86     if err != nil {
    87         code = errWriteFileFailed
    88         msg = err.Error()
    89         return
    90     }
    91     if n > (maxSize) {
    92         os.Remove(fileDir + fileName)
    93         code = errRequestEntityTooLarge
    94         msg = fmt.Sprint("上传文件不要超过", maxSize>>20, "M")
    95         return
    96     }
    97     return Success, ""
    98 }
    dealUpload(server)

    go用multipart form上传文件

  • 相关阅读:
    Windows脚本 Bat批处理命令使用教程
    [Jobdu] 题目1420:Jobdu MM分水果
    排序算法的时间复杂度和空间复杂度
    (转) CS的顶级会议和期刊
    句柄是什么?1
    批处理for命令详解(转)
    cmd批处理常用符号详解
    【转帖】请问两个大于号>>代表什么意思?
    今天玩angry birds
    C/C++数组名与指针区别深入探索
  • 原文地址:https://www.cnblogs.com/cdyboke/p/6816357.html
Copyright © 2020-2023  润新知