zoukankan      html  css  js  c++  java
  • 上传文件

    1. 上传单个文件

    multipart/form-data格式用于文件上传。

    gin文件上传与原生的net/http方法类似,不同在于gin把原生的request封装到c.Request中。

    func main() {
        r := gin.Default()
        //限制上传最大尺寸
        r.MaxMultipartMemory = 8 << 20 //8M
        r.POST("/upload", func(c *gin.Context) {
            file, err := c.FormFile("file")
            if err != nil {
                c.String(500, "上传图片出错")
            }
            /*
               也可以直接使用io操作,拷贝文件数据。
               out, err := os.Create(filename)
               defer out.Close()
               _, err = io.Copy(out, file)
            */
            // c.JSON(200, gin.H{"message": file.Header.Context})
            c.SaveUploadedFile(file, file.Filename)
            c.String(http.StatusOK, file.Filename)
        })
        r.Run()
    }
    
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <meta http-equiv="X-UA-Compatible" content="ie=edge">
        <title>Document</title>
    </head>
    <body>
    <form action="http://127.0.0.1:8080/post?id=1234&page=1 HTTP/1.1" method="post" action="application/x-www-form-urlencoded">
        用户名:<input type="text" name="name" placeholder="请输入你的用户名">  <br>
        密   码:<input type="password" name="message" placeholder="请输入你的密码">  <br>
        <input type="submit" value="提交">
    </form>
    </body>
    </html>

    2. 上传多个文件

    所谓多个文件,无非就是多一次遍历文件,然后一次copy数据存储即可。

    与单个文件上传类似,只不过使用了c.Request.MultipartForm得到文件句柄,再获取文件数据,然后遍历读写。

    func main() {
      
        // 默认使用了2个中间件Logger(), Recovery()
        r := gin.Default()
        // 限制表单上传大小 8MB,默认为32MB
        r.MaxMultipartMemory = 8 << 20
        r.POST("/upload", func(c *gin.Context) {
            form, err := c.MultipartForm()
            if err != nil {
                c.String(http.StatusBadRequest, fmt.Sprintf("get err %s", err.Error()))
            }
            // 获取所有图片
            files := form.File["files"]
            // 遍历所有图片
            for _, file := range files {
                // 逐个存
                if err := c.SaveUploadedFile(file, file.Filename); err != nil {
                    c.String(http.StatusBadRequest, fmt.Sprintf("upload err %s", err.Error()))
                    return
                }
            }
            c.String(200, fmt.Sprintf("upload ok %d files", len(files)))
        })
        //默认端口号是8080
        r.Run(":8000")
    }
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <meta http-equiv="X-UA-Compatible" content="ie=edge">
        <title>Document</title>
    </head>
    <body>
    <form action="http://localhost:8000/upload" method="post" enctype="multipart/form-data">
        上传文件:<input type="file" name="files" multiple>
        <input type="submit" value="提交">
    </form>
    </body>
    </html>
    

      

  • 相关阅读:
    解决Android的ListView控件滚动时背景变黑
    倒计时实现网页跳转
    java获取当前路径
    JavaScript笔记之面向对象
    Jqery调用WebService(.Net3.5环境下)
    Android开发:TabActivity中onKeyDown无法响应的解决方法
    最近不知道什么时候开始D3D11CreateDevice返回E_FAIL
    C++ allocator及一些影响程序性能的因素
    AOP切面编程 几年前写的,移过来
    Adaptive Transparency
  • 原文地址:https://www.cnblogs.com/yzg-14/p/13141932.html
Copyright © 2011-2022 走看看