以文本方式查看主题 - Foxtable(狐表) (http://foxtable.com/bbs/index.asp) -- 专家坐堂 (http://foxtable.com/bbs/list.asp?boardid=2) ---- [求助]BeforeAttachFile事件求助 (http://foxtable.com/bbs/dispbbs.asp?boardid=2&id=172447) |
-- 作者:huangfanzi -- 发布时间:2021/10/13 14:00:00 -- [求助]BeforeAttachFile事件求助 在上传文件时,希望自动换文件名,换名的规则是,【单据号】列内容再加流水序号 例如本条记录的单据号是 AAA ,前后上传了11个文件,文件名能自动替换成: AA-1 AA-2 AA-3 。。。 AA-10 AA-11 请老师帮忙写个代码示例,谢谢。
|
-- 作者:有点蓝 -- 发布时间:2021/10/13 14:15:00 -- 比如上传了11个文件,然后删除了第4个文件,再添加一个文件,新添加的应该取什么名称?AA-4还是AA-12? |
-- 作者:huangfanzi -- 发布时间:2021/10/13 17:41:00 -- AA-12就行,这样方便点,其实我的目的就最用户上传文件时,都是莫名其妙的名字,比如微信中导出的图片,现在改下名字,文件名长度也能控制的短些 |
-- 作者:有点蓝 -- 发布时间:2021/10/14 8:37:00 -- 建议名称改为AA-01、AA-02、...、AA-10这种,编号等长,不然就只有遍历文件夹里的所有文件逐个判断了,效率很低 Dim max as string = e.datatable.compute("max(文件)","单据号=\'" & e.datarow("单据号") & "\'") If max > "" Then dim id as string = cint(max.substring(max.length - 2)) + 1 e.FileName = e.datarow("单据号") & format(id,"00") & ".jpg"
Else e.FileName = e.datarow("单据号") & "01.jpg" End If |
-- 作者:huangfanzi -- 发布时间:2021/10/15 16:44:00 -- 老师,看下我改的代码,实测了下,没用,文件名没改过来,也没报错,项目中的附件列是备注型的,没有设置扩展类型。 BeforeAttachFile事件 Dim max As String = e.DataTable.Compute("Max(附件)","单据=\'" & e.DataRow("单据") & "\'") Dim id As Integer Dim hz As String If max > "" Then id = CInt(Max.SubString(max.LastIndexOf(".")-2,2)) + 1 hz = Max.SubString(max.LastIndexOf("."),max.length - max.LastIndexOf(".")) e.FileName = e.DataRow("单据") & "-" & Format(id,"00") & hz Else hz = e.FileName.SubString(e.FileName.LastIndexOf("."),e.FileName.length - e.FileName.LastIndexOf(".")) e.FileName = e.DataRow("单据") & "-01" & hz End If 以下是文件上传的代码,一直正常执行中。 BeforeAddFile事件: Dim frm As WinForm.Form = Forms("文件上传模式窗口") If frm.Opened Then e.Cancel = True Dim dlg As New openFileDialog \'定义一个新的SaveFileDialog dlg.Filter= "文件|*.txt;*.bmp;*.jpg;*.png;*.pdf;*.doc;*.docx;*.xls;*.xlsx;*.rar;*.zip;*.jpeg" \'设置筛选器 dlg.MultiSelect = True If dlg.showDialog = DialogResult.Ok Then \'如果用户单击了确定按钮 Dim pv As WinForm.FileManager = frm.Controls("FileManager1") pv.FTPclient = _ftp pv.ManagerCommand.Visible = False pv.ConnectCommand.Visible = False pv.FullViewCommand.Visible = False Dim ls = e.DataRow.Lines("附件") For Each f As String In dlg.FileNames Dim file = "/QdgcWeb/www/upload/atta/附件/生产记录/" & e.DataRow("单据号") & "/" & filesys.GetName(f) If _ftp.DirExists("/QdgcWeb/www/upload/atta/附件/生产记录/" & e.DataRow("单据号")) = False Then _ftp.MakeDir("/QdgcWeb/www/upload/atta/附件/生产记录/" & e.DataRow("单据号")) \'此处不可删除"/附件/",要不然会直接在 本机的RemoteFiles目录下生成编号名目录 End If Dim Result As DialogResult If _ftp.FileExists(file) Then Result = MessageBox.Show("文件已经存在,是否覆盖?", "提示", MessageBoxButtons.YesNo, MessageBoxIcon.Question) End If If result = Nothing OrElse result = DialogResult.Yes Then If _ftp.Upload(f,file,True) = True Then If ls.contains(file) = False Then ls.add(file) pv.AddFile(file) End If Else MessageBox.Show( f & "上传失败" ,"提示" ,MessageBoxButtons.OK,MessageBoxIcon.Question) End If End If Next e.DataRow.lines("附件") = ls e.DataRow.Save _ftp.Close End If End If |
-- 作者:有点蓝 -- 发布时间:2021/10/15 16:49:00 -- ftp文件不会触发BeforeAttachFile事件。建议使用按钮上传,或者到BeforeAddFile事件处理。 另外4楼的方法仅适合单元格只有一个文件的情况,如果一个单元格会有多个文件的,只能遍历所有文件一个个判断
|
-- 作者:有点蓝 -- 发布时间:2021/10/15 16:50:00 -- 建议使用编号+时间,就不要搞那么麻烦了 |
-- 作者:huangfanzi -- 发布时间:2021/10/15 17:00:00 -- 用时间也行,但现在的问题是,上面这个改名代码并没有执行,连报错也没有,是不是不应该写在这个BeforeAttachFile事件中啊? |
-- 作者:有点蓝 -- 发布时间:2021/10/15 17:06:00 -- 认真看6楼 |
-- 作者:huangfanzi -- 发布时间:2021/10/15 17:13:00 -- 不好意思,习惯性最后一楼,没注意老师连着发了2层的回复,还是用BeforeAddFile来处理,能帮我改下代码吗,不知在哪个地方改名字 |