前言
用到的所有东西有:golang、gin、typescript、axios、arco design
后端用的是golang+gin搭建服务端,前端在使用arco design的upload组件的默认上传时感觉有点难受,用axios写了个自定义上传
后端
func UploadStudentFile(ctx *gin.Context) { fileName, err := url.QueryUnescape(ctx.Request.Header.Get("X-FileName")) if err != nil { ctx.JSON(http.StatusOK, ErrorResponse(serializer.CodeParamErr, "上传失败", err)) return } if fileExt := strings.ToLower(path.Ext(fileName)); fileExt != ".zip" { ctx.JSON(http.StatusOK, ErrorResponse(serializer.CodeParamErr, "文件类型校验失败", nil)) return } if strings.Contains(fileName, "..") || strings.Contains(fileName, "/") { ctx.JSON(http.StatusOK, ErrorResponse(serializer.CodeNoPermissionErr, "非法上传", nil)) return } outputFile, _ := os.Create("./upload/" + fileName) defer outputFile.Close() body := ctx.Request.Body defer body.Close() _, err = io.Copy(outputFile, body) if err != nil { ctx.JSON(http.StatusOK, ErrorResponse(serializer.CodeParamErr, "上传失败", err)) return } ctx.JSON(http.StatusOK, OKResponse("上传成功", nil)) }
前端
<Upload accept={'.zip'} //允许上传的文件后缀 name="file" limit={1} autoUpload={true} //选了文件后直接执行上传操作 listType="text" // 上传前弹确认上传选框 beforeUpload={(file) => { return new Promise((resolve, reject) => { Modal.confirm({ title: '确认上传', content: `确认上传 ${file.name}`, onConfirm: () => resolve(true), onCancel: () => reject('cancel'), }); }); }} // 自定义上传器 customRequest={(options) => { const { onProgress, onError, onSuccess, file } = options; const header = { 'Content-Type': 'application/octet-stream', 'X-FileName': encodeURIComponent(file.name), }; axios .create({ // 上传百分比,实现上传进度 onUploadProgress: function (ProgressEvent) { const load = ProgressEvent.loaded; const total = ProgressEvent.total; const progress = (load / total) * 100; console.log(progress); onProgress(progress); }, }) .post('file/upload', file, { headers: header, }) .then((res) => { if (res.status === 200) { onSuccess(res); } else { onError(res.data.msg); } }); }} >
后记
本文固定链接:https://www.bokro.cn/241.html
如需帮助请联系:admin@bokro.cn
原创文章,如需转载请注明出处