[TOC]
- iris多文件上传示例目录结构示例代码
iris多文件上传示例
目录结构
主目录uploadFiles
—— templates —— upload_form.html —— uploads —— main.go
示例代码
/templates/upload_form.html
<html><head><title>Upload file</title></head><body> <form enctype="multipart/form-data" action="http://127.0.0.1:8080/upload" method="POST"> <input type="file" name="uploadfile" multiple/> <input type="hidden" name="token" value="{{.}}" /> <input type="submit" value="upload" /> </form></body></html>
main.go
package mainimport ( "crypto/md5" "fmt" "io" "mime/multipart" "os" "path/filepath" "strconv" "strings" "time" "github.com/kataras/iris")func main() { app := iris.New() app.RegisterView(iris.HTML("./templates", ".html")) //将upload_form.html提供给客户端 app.Get("/upload", func(ctx iris.Context) { //创建一个令牌(可选)。 now := time.Now().Unix() h := md5.New() io.WriteString(h, strconv.FormatInt(now, 10)) token := fmt.Sprintf("%x", h.Sum(nil)) //使用令牌渲染表单以供您使用 ctx.View("upload_form.html", token) }) //处理来自upload_form.html的请求 app.Post("/upload", func(ctx iris.Context) { //上传任意数量的文件(表单输入中的multiple属性)。 //第二个参数完全是可选的,它可以用来根据请求更改文件的名称, //在这个例子中,我们将展示如何使用它,通过在上传文件前加上当前用户的ip前缀 ctx.UploadFormFiles("./uploads", beforeSave) }) app.Post("/upload_manual", func(ctx iris.Context) { //获取通过iris.WithPostMaxMemory获取的最大上传值大小。 maxSize := ctx.Application().ConfigurationReadOnly().GetPostMaxMemory() err := ctx.Request().ParseMultipartForm(maxSize) if err != nil { ctx.StatusCode(iris.StatusInternalServerError) ctx.WriteString(err.Error()) return } form := ctx.Request().MultipartForm files := form.File["files[]"] failures := 0 for _, file := range files { _, err = saveUploadedFile(file, "./uploads") if err != nil { failures++ ctx.Writef("failed to upload: %s\n", file.Filename) } } ctx.Writef("%d files uploaded", len(files)-failures) }) //在http://localhost:8080启动服务器,上传限制为32 MB。 app.Run(iris.Addr(":8080"), iris.WithPostMaxMemory(32<<20))}func saveUploadedFile(fh *multipart.FileHeader, destDirectory string) (int64, error) { src, err := fh.Open() if err != nil { return 0, err } defer src.Close() out, err := os.OpenFile(filepath.Join(destDirectory, fh.Filename), os.O_WRONLY|os.O_CREATE, os.FileMode(0666)) if err != nil { return 0, err } defer out.Close() return io.Copy(out, src)}func beforeSave(ctx iris.Context, file *multipart.FileHeader) { ip := ctx.RemoteAddr() //确保以某种方式格式化ip //可以用于文件名(简单情况): ip = strings.Replace(ip, ".", "_", -1) ip = strings.Replace(ip, ":", "_", -1) //你可以使用time.Now,为文件添加前缀或后缀 //基于当前时间戳。 //即unixTime := time.Now().Unix() //使用$IP-为Filename添加前缀 //不需要更多动作,内部上传者将使用此功能 //将文件保存到"./uploads"文件夹中的名称。 file.Filename = ip + "-" + file.Filename}
