beego文件上传,基于fileupload

beego文件上传,本章内容只是展示获取文件信息,获取文件名称,获取文件大小,保存到指定目录,如果你想结合fileupload插件,本文实现了大部分。有问题可以留言。

结尾 json输出只是简单展示下,正常结合fileupload是需要按照fileupload的返回格式进行返回,按照FileInfo可独立开发出。

package controllers

import (
	"bytes"
	"fmt"
	"github.com/mingzhehao/goutils/filetool"
	"io"
	"log"
	"mime/multipart"
	"net/url"
	"os"
	"path/filepath"
	"regexp"
	"strings"
	"time"
)

type FileuploadController struct {
	BaseController
}

type Sizer interface {
	Size() int64
}

const (
	LOCAL_FILE_DIR    = "static/uploads/file"
	MIN_FILE_SIZE     = 1       // bytes
	MAX_FILE_SIZE     = 5000000 // bytes
	IMAGE_TYPES       = "(jpg|gif|p?jpeg|(x-)?png)"
	ACCEPT_FILE_TYPES = IMAGE_TYPES
	EXPIRATION_TIME   = 300 // seconds
	THUMBNAIL_PARAM   = "=s80"
)

var (
	imageTypes      = regexp.MustCompile(IMAGE_TYPES)
	acceptFileTypes = regexp.MustCompile(ACCEPT_FILE_TYPES)
)

type FileInfo struct {
	Url          string `json:"url,omitempty"`
	ThumbnailUrl string `json:"thumbnailUrl,omitempty"`
	Name         string `json:"name"`
	Type         string `json:"type"`
	Size         int64  `json:"size"`
	Error        string `json:"error,omitempty"`
	DeleteUrl    string `json:"deleteUrl,omitempty"`
	DeleteType   string `json:"deleteType,omitempty"`
}

func (fi *FileInfo) ValidateType() (valid bool) {
	if acceptFileTypes.MatchString(fi.Type) {
		return true
	}
	fi.Error = "Filetype not allowed"
	return false
}

func (fi *FileInfo) ValidateSize() (valid bool) {
	if fi.Size < MIN_FILE_SIZE {
		fi.Error = "File is too small"
	} else if fi.Size > MAX_FILE_SIZE {
		fi.Error = "File is too big"
	} else {
		return true
	}
	return false
}

func check(err error) {
	if err != nil {
		panic(err)
	}
}

func escape(s string) string {
	return strings.Replace(url.QueryEscape(s), "+", "%20", -1)
}

func getFormValue(p *multipart.Part) string {
	var b bytes.Buffer
	io.CopyN(&b, p, int64(1<<20)) // Copy max: 1 MiB
	return b.String()
}

func (this *FileuploadController) Handle() {
	f, h, err := this.GetFile("files[]")
	defer f.Close()
	if err != nil {
		fmt.Println("getfile err ", err)
		this.Data["json"] = "no file"
		this.ServeJSON()
		return
	} else {
		var Url string
		ext := filetool.Ext(h.Filename)
		fi := &FileInfo{
			Name: h.Filename,
			Type: ext,
		}
		if !fi.ValidateType() {
			this.Data["json"] = "invalid file type"
			this.ServeJSON()
			return
		}
		var fileSize int64
		if sizeInterface, ok := f.(Sizer); ok {
			fileSize = sizeInterface.Size()
			fmt.Println(fileSize)
		}
		fileExt := strings.TrimLeft(ext, ".")
		fileSaveName := fmt.Sprintf("%s_%d%s", fileExt, time.Now().Unix(), ext)
		imgPath := fmt.Sprintf("%s/%s", LOCAL_FILE_DIR, fileSaveName)

		filetool.InsureDir(LOCAL_FILE_DIR)

		this.SaveToFile("files[]", imgPath) // 保存位置在 static/upload,没有文件夹要先创建
		if err == nil {
			Url = "/" + imgPath
		}
		this.Data["json"] = Url
		this.ServeJSON()
		return
	}
}

func substr(s string, pos, length int) string {
	runes := []rune(s)
	l := pos + length
	if l > len(runes) {
		l = len(runes)
	}
	return string(runes[pos:l])
}

func getParentDirectory(dirctory string) string {
	return substr(dirctory, 0, strings.LastIndex(dirctory, "/"))
}

func getCurrentDirectory() string {
	dir, err := filepath.Abs(filepath.Dir(os.Args[0]))
	if err != nil {
		log.Fatal(err)
	}
	return strings.Replace(dir, "\\", "/", -1)
}


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
commons-fileupload是一个用于处理文件上传的Java类库。它提供了简单易用的API,可以用于实现文件上传功能。要使用commons-fileupload,你需要进行以下步骤: 1. 导入commons-fileupload库:下载commons-fileupload库的jar文件,并将其添加到你的项目中。 2. 创建Servlet或Controller类:创建一个处理文件上传的Servlet或Controller类。 3. 创建DiskFileItemFactory对象:使用DiskFileItemFactory类创建一个文件项工厂对象,设置临时文件存储路径和内存缓冲区大小。 4. 创建ServletFileUpload对象:使用ServletFileUpload类创建一个文件上传对象,并设置文件上传大小限制和字符编码。 5. 解析请求:使用ServletFileUpload对象的parseRequest()方法解析请求,得到FileItem对象的列表。 6. 处理文件:遍历FileItem对象的列表,对每个文件项进行处理。你可以判断文件项是否是普通字段还是文件,以及获取字段名称、文件名、文件大小等信息。 以下是一个简单的示例代码: ```java import org.apache.commons.fileupload.*; import org.apache.commons.fileupload.disk.*; import org.apache.commons.fileupload.servlet.*; import javax.servlet.http.*; import java.io.*; import java.util.*; public class FileUploadServlet extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { DiskFileItemFactory factory = new DiskFileItemFactory(); ServletFileUpload upload = new ServletFileUpload(factory); try { List<FileItem> items = upload.parseRequest(request); for (FileItem item : items) { if (item.isFormField()) { // 处理普通字段 String fieldName = item.getFieldName(); String fieldValue = item.getString(); // ... } else { // 处理文件 String fieldName = item.getFieldName(); String fileName = item.getName(); long fileSize = item.getSize(); // ... } } // 文件上传成功 response.getWriter().println("文件上传成功!"); } catch (FileUploadException e) { // 文件上传失败 response.getWriter().println("文件上传失败!"); } } } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值