拖拽传图 Iris + DropzoneJS

2024-06-12 15:38
文章标签 拖拽 iris 传图 dropzonejs

本文主要是介绍拖拽传图 Iris + DropzoneJS,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Iris官方其实很厚道,有很多有用的例子,而社区则是文档多于实战。源于官方示例库([英文源文])(https://github.com/kataras/iris/tree/master/_examples/tutorial/dropzonejs),本文采用 DropzoneJS and Go实现图片上传,后端裁剪,前端呈现,代码量少但胜在实用,适合新同学实战。

涉及的点

  • DropzoneJS 拖拽上传图片前端库,可显示进度
  • Iris 类(理念相近)PHP 中的 Laravel 框架,但比之轻
  • 相关同步,图片,文件,路径等标准库
  • 第三方库 nfnt/resize,用于缩略图等比例裁剪

效果图

拖拽上传图片 DropzoneJS+Iris

前端

引入的DropzoneJS库本身不依赖于jQeury,表单亦无需 enctype,本文只是用jquery向后端发数据

DOM布局

表单 file 类型节点, 要携带 multiple属性,以示多文件上传

    <form action="/upload" method="post" class="dropzone" id="my-dropzone"><div class="fallback"><input type="file" name="file" multiple/><input type="submit" value="Upload"></div></form>

DropzoneJS

addedfile 事件,使用回调数据,其添加到对应的文件对象上去; complete 事件,显示进度条

    Dropzone.options.myDropzone ={paramName:"file",init:function(){thisDropzone = this;$.get('/uploads',function(data){if(data==null){return}$.each(data,function(key,value){var mockFile = {name:value.name,size:value.size}thisDropzone.emit("addedfile", mockFile)thisDropzone.options.thumbnail.call(thisDropzone, mockFile, '/public/uploads/thumbnail_'+value.name)// 进度条thisDropzone.emit("complete", mockFile)})})}}

后端

项目目录结构如下

│  main.go
├─public
│  ├─css
│  │      dropzone.css
│  ├─js
│  │      dropzone.js
│  └─uploads
│          kk048.jpg
│          ll031.jpg
│          thumbnail_kk048.jpg
│          thumbnail_ll031.jpg
│          thumbnail_web_spring.png
│          web_spring.png
└─viewsupload.html

数据

文件标签结构体方便前端接收json格式的文件名及大小的信息

const uploadsDir = "./public/uploads/"
type uploadedFile struct {// {name: "", size: } 适应dropzone所需Name string `json:"name"`Size int64  `json:"size"`
}
type uploadedFiles struct {dir   string  // 文件存储目录items []uploadedFile // 多文件数据记录进切片mu    sync.RWMutex // 安全类型的切片锁
}

操作集

*uploadedFiles类型的创建及其方法

// 获取多文件实例
func scanUploads(dir string) *uploadedFiles {f := new(uploadedFiles)index := dir[len(dir)-1]if index != os.PathSeparator && index != '/' {dir += string(os.PathSeparator)}// 递归创建文件夹if err := os.MkdirAll(dir, os.FileMode(0666)); err != nil {return f}f.scan(dir)return f
}func (f *uploadedFiles) scan(dir string) {f.dir = dir// 根目录递归分析,得到图片文件信息filepath.Walk(dir, func(path string, info os.FileInfo, err error) error {// 排除目录及缩略图if info.IsDir() || strings.HasPrefix(info.Name(), "thumbnail_") {return nil}// 添加非缩略图文件f.add(info.Name(), info.Size())return nil})
}
// 添加文件信息
func (f *uploadedFiles) add(name string, size int64) uploadedFile {uf := uploadedFile{Name: name,Size: size,}f.mu.Lock()f.items = append(f.items, uf)f.mu.Unlock()return uf
}
// 创建缩略图
func (f *uploadedFiles) createThumbnail(uf uploadedFile) {file, err := os.Open(path.Join(f.dir, uf.Name))if err != nil {return}defer file.Close()name := strings.ToLower(uf.Name)out, err := os.OpenFile(f.dir+"thumbnail_"+uf.Name, os.O_WRONLY|os.O_CREATE, 0666)if err != nil {return}defer out.Close()// 裁剪缩略图if strings.HasSuffix(name, "jpg") {img, err := jpeg.Decode(file)if err != nil {return}resized := resize.Thumbnail(180, 180, img, resize.Lanczos3)// 将图像写入输出流jpeg.Encode(out, resized, &jpeg.Options{Quality: jpeg.DefaultQuality})} else if strings.HasSuffix(name, "png") {img, err := png.Decode(file)if err != nil {return}// 等比例缩放resized := resize.Thumbnail(180, 180, img, resize.Lanczos3)png.Encode(out, resized)}
}

Iris应用

好的代码会说话,上码

func main() {app := iris.New()// 注册视图引擎app.RegisterView(iris.HTML("./views", ".html"))// 发布静态资源服务app.HandleDir("/public", "./public")// 注册首页路由app.Get("/", func(ctx iris.Context) {ctx.View("upload.html")})// 扫描上传后文件信息(缩略图信息)files := scanUploads(uploadsDir)// 多图片信息api查询接口,返回jsonapp.Get("/uploads", func(ctx iris.Context) {ctx.JSON(files.items)})// 注册Post上传app.Post("/upload", iris.LimitRequestBodySize(10<<20), func(ctx iris.Context) {// 多文件上传 ctx是一个集请求与响应的组合体file, info, err := ctx.FormFile("file")if err != nil {ctx.StatusCode(iris.StatusInternalServerError)ctx.Application().Logger().Warnf("Error while uploading: %v", err.Error())return}defer file.Close()fname := info.Filenameout, err := os.OpenFile(uploadsDir+fname, os.O_WRONLY|os.O_CREATE, 0666)if err != nil {ctx.StatusCode(iris.StatusInternalServerError)ctx.Application().Logger().Warnf("Error while preparing the new file: %v", err.Error())return}defer out.Close()// 将文件上传流复制到服务器本地io.Copy(out, file)// 可选 顺序添加文件列表uploadedFile := files.add(fname, info.Size)// goroutine创建缩略图go files.createThumbnail(uploadedFile)})app.Run(iris.Addr("localhost:8080"))
}

参考

源代码
Iris新手指北

这篇关于拖拽传图 Iris + DropzoneJS的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1054627

相关文章

类codepen的实现可拖拽窗口demo

首先说下思想 flex或者其他布局方式,实现左右分割布局,主盒子宽度100%,左右布局中包含一个分割条(可在布局容器中,也可以单独定义)为分隔条绑定鼠标点击事件,为document绑定鼠标移动事件和鼠标放开事件,通过监听鼠标移动事件和上一个状态保存下来的鼠标位置作对比,判断当前鼠标移动方向(往左还是往右)然后计算当前鼠标位置和鼠标点击位置的距离,来计算左右容器的变化,然后通过dom的方式设置宽度

记录一个拖拽组件vue3+ts

记录一个拖拽组件vue+ts “vue”: “^3.0.0” “typescript”: “~4.1.5” 我这个是vue 3的最高版本,可以使用defineModel 父组件 <h1>props传值</h1><ModuleOrder v-model:orderList="orderList" v-model:defaultList="defaultList" ></ModuleO

git如何设置嵌套仓库(设置子树或子模块),并解决直接将一个仓库拖拽到另一个仓库中导致的问题

git 将一个仓库拷贝到另一个仓库的文件夹下。默认git并不会处理,上传上去之后,只会创建一个文件夹,但是这个文件夹点不开。 在 git add . 的时候,会报出警告: 警告:正在添加嵌入式 git 仓库:client提示: You've added another git repository inside your current repository.提示: Clones of

JS 原生实现拖拽功能

JS 原生实现拖拽功能 序言功能实现创建元素获取元素逻辑处理事件绑定 序言 我们有时候功能中会涉及到拖拉拽模块功能,但有时候也是束手无策,不知道该怎么去写,那我们接下来剖析一下吧 功能实现 创建元素 <div id="draggableElement">k可以拖拽的元素</div> 获取元素 // 获取元素的id为draggableElementvar drag

vue-自定义指令-拖拽

主要思想: 获取拖拽的dom元素,在oDiv.onmousedown事件内获取鼠标相对dom元素本身的位置: var disX=ev.clientX-oDiv.offsetLeft;var disY=ev.clientY-oDiv.offsetTop; 再通过document.onmousemove事件计算dom元素左上角相对 视口的距离: var l=ev.clientX-disX;v

鸿蒙开发入门day16-拖拽事件和手势事件

(创作不易,感谢有你,你的支持,就是我前行的最大动力,如果看完对你有帮助,还请三连支持一波哇ヾ(@^∇^@)ノ) 目录 拖拽事件 概述 拖拽流程 ​手势拖拽 ​鼠标拖拽 拖拽背板图 开发步骤 通用拖拽适配 多选拖拽适配 手势事件 gesture(常规手势绑定方法) priorityGesture(带优先级的手势绑定方法) parallelGesture(并行手势绑定

golang学习笔记——Gin、Beego、Iris、Echo框架学习资料

Gin Gin文档-中文 Gin文档-英文 Beego Beego文档-中文 Beego文档-英文 应用例子 Iris Iris文档-中文 Iris文档-英文 Echo Echo文档-中文 Echo文档-英文 Echo中间件

使用RecyclerView实现item拖拽变换位置重新排序

小知识解决大问题,问题处理+经验分享,大家好,我是时代新人!今天给大家分享一个小例子,请往下看: 今天用RecyclerView实现一个拖拽交换位置,和编辑删除的功能。先来个效果图看一下 1、定义一个ItemTouchHelperAdapter接口 import androidx.recyclerview.widget.RecyclerView;/*** Created by WJY.*

[Labview]图片叠加下的表格视图拖拽功能:挖坑粗糙版

没错,又是Labview表格T - T 由于项目中用到的表格上有一张用于画框的二维图片,感兴趣可看这篇 [Labview] 表格单元格外边框 二维图片叠加绘图 因此在滚动条与鼠标滚轮的基础上,想再增加一个拖拽移动的功能。 但 [二维图片] 并没有 拖拽开始 的事件,因此只能通过 鼠标按下 与 鼠标释放 两个事件的时间与坐标进行差值判断。 逻辑上应该没问题,可惜实现效果非常智商低下。

JVS动态首页全攻略:权限设置、组件拖拽,轻松打造个性化门户

概要说明 “动态首页”通常指的是一个网站或应用的主页,其内容会根据时间、用户行为、或其他因素实时更新。这样的设计旨在为用户提供最新、最相关的信息,并增强用户的互动体验。在jvs平台用户可自定义设置角色权限实现让不同用户看到不同的首页样式,从而实现千人千面的功能,同时支持自定义添加多种组件以拖拉拽方式设计并添加数据。下面就是对首页设计配置的操作说明。 配置入口 门户首页配置的入口如下图所示