golang实现图片上传

dlay0806 · 2017-12-25 03:43:04 · 8885 次点击 · 预计阅读时间 3 分钟 · 大约8小时之前 开始浏览    
这是一个创建于 2017-12-25 03:43:04 的文章,其中的信息可能已经有所发展或是发生改变。

golang实现图片上传

该代码为使用beego实现前后端图片上传。话不多说,直接上代码。

1.前端代码

html代码:

  <div class="col-5 f-l text text-r">背景图(必须):</div>
  <div class="img-box">
    <label>
      <span class="copy-btn Hui-iconfont">&#xe679;</span>
      <input type="file" class="up-file">
    </label>
  </div>
  <div class="img-file col-offset-5">
  </div>

JS代码:

a.读取图片代码,用于在页面上显示。

//读取图片
function loadImg(){
    //获取文件
    var file = $(".up-file")[0].files[0];
    //创建读取文件的对象
    var reader = new FileReader();
    //创建文件读取相关的变量
    var imgFile;
    //为文件读取成功设置事件
    reader.onload=function(e) {
        var e=window.event||e;
        imgFile = e.target.result;
        console.log(imgFile);
        $(".img-file").css({'background':"url("+imgFile+")"});
        isimg();
    };

    //正式读取文件
    reader.readAsDataURL(file);

}

b.验证是否有图片存在

//是否有图片验证
function isimg(){
    var img= $(".img-file").css('background-image');

    if(img.indexOf("data:image")==-1&&img.indexOf(".jpg")==-1){
        $(".mess").html("请添加背景图片").css("opacity",1);
        return false;
    }
    else{
        $(".mess").css("opacity",0).html("");
        return true;
    }
}

c.提交上传,将图片以base64编码的方式传给后端

function addData(){
    var url=$(".img-file").css("background-image");
    var data1=[{"name":"url","value":url}];
    $.ajax({
        url:"/commmethod/method/uploadimg",
        data:data1,
        type:"post",
        ContentType:"application/json",
        success:function(resp){
         ......
        }
    });
}

2.后端代码

func (this *CommMethodController) UploadImg() {
    fileurl := this.GetString("url")
    DataArr := strings.Split(fileurl, ",")
  //去除包装,获取到base64编码
    imgBase64 := DataArr[1][:len(DataArr[1])-2]
  //base64转码
    imgs, err := base64.StdEncoding.DecodeString(imgBase64)
    if err != nil {
        beego.Error("base64 decode error:", err)
    }
    timenow := time.Now().Unix()
    file, err := os.OpenFile("./static/img/"+strconv.FormatInt(timenow, 10)+".jpg", os.O_CREATE|os.O_WRONLY, 0644)
    if err != nil {
        beego.Debug("create file error:", err)
    }
    w := bufio.NewWriter(file) //创建新的 Writer 对象
    _, err3 := w.WriteString(string(imgs))
    if err3 != nil {
        beego.Error("write error:", err3)
    }
    w.Flush()
    defer file.Close()
    imgname := strconv.FormatInt(timenow, 10) + ".jpg"
    t := struct {
        ImageName string `json:"imagename"`
    }{imgname}
    this.Data["json"] = t
    this.ServeJSON()
}

/**
*此代码主要用于编辑图片时,删除原有图片
 * 判断文件是否存在  存在返回 true 不存在返回false
 */
func checkFileIsExist(filename string) bool {
    var exist = true
    if _, err := os.Stat(filename); os.IsNotExist(err) {
        exist = false
    }
    return exist
}

该DEMO使用的是原生Js,图片通过base64编码传输。

如有小伙伴对代码有异议或建议提供的,请关注“今日头条”的帐号“编程践行者”。大家一起讨论,一起学习,欢迎骚扰


有疑问加站长微信联系(非本文作者))

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

8885 次点击  
加入收藏 微博
5 回复  |  直到 2019-12-12 17:04:17
aboc
aboc · #1 · 7年之前

图片不建议通过base64编码上传,因为这样会增加上传尺寸,且后端会额外增加转码过程。 当图片过大的时候,效率就会低下

dlay0806
dlay0806 · #2 · 7年之前
abocaboc #1 回复

图片不建议通过base64编码上传,因为这样会增加上传尺寸,且后端会额外增加转码过程。 当图片过大的时候,效率就会低下

是的,适合小尺寸的图片上传。

tupunco
tupunco · #3 · 7年之前

内存够就用这个方法, 好得很~ 手动滑稽

tansuo1989
tansuo1989 · #4 · 7年之前

问一下:

 imgBase64 := DataArr[1][:len(DataArr[1])-2]

这里为什么要这样用,直接:

imgBase64:=DataArr[1]

不行吗?

wdj632
wdj632 · #5 · 5年之前

请问下上传上去之后js怎么查看,也就是在浏览器怎么查看呢

添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传