以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.com/bbs/index.asp)
--  专家坐堂  (http://foxtable.com/bbs/list.asp?boardid=2)
----  [求助]移动开发 审批前怎么打开上传的附件?  (http://foxtable.com/bbs/dispbbs.asp?boardid=2&id=106494)

--  作者:shenyl0211
--  发布时间:2017/9/10 13:54:00
--  [求助]移动开发 审批前怎么打开上传的附件?
在“合同评审”表中,“申请人”上传了3个“附件”:
/合同评审/申请人/A.docx
/合同评审/申请人/B.doc
/合同评审/申请人/C.jpg
审批人如果在PC端审批,在“附件”窗口中可以分别打开这3个文件进行查看,然后决定是否同意。
但如果在移动端,下列代码可以看到上述3个文件,但要怎样设置才能在点击“审批”按钮前打开查看呢?
请高手指点,谢谢!

    Case "test.htm"
        Dim wb As New weui
        wb.AddForm("","form1","test.htm")
        Dim dr As DataRow = DataTables("合同评审").SQLFind("[_Identify]=296")
        With wb.AddInputGroup("form1","ipg1","附件")
            .AddTextArea("附件",5).Value = dr("附件")
        End With
        With wb.AddButtonGroup("form1","btg1",True)
            .Add("btn1", "审批", "submit")
        End With
        e.WriteString(wb.Build)

--  作者:有点甜
--  发布时间:2017/9/10 14:03:00
--  

做一个下载文件的页面,如 download.htm?key=abc.txt

 

Select Case e.Path
    Case "test.htm"
       
    Case "download.htm"
        Dim file As String = e.Values("file")
        Dim fs As System.IO.FileStream = Nothing
        fs = System.IO.File.Open("d:\\" & file, System.IO.FileMode.Open)
        Dim btFile As Byte() = New Byte(fs.Length - 1) {}
        fs.Read(btFile, 0, Convert.ToInt32(fs.Length))
        fs.Close()
       
        e.Response.Headers("Content-Disposition") = "attachment;filename=" & file
        \'输出文件格式
        e.Response.ContentType = "application/octet-stream"
       
        Dim output = e.response.OutputStream
        output.Write(btFile,0,btFile.Length)
        output.Close()
End Select

[此贴子已经被作者于2017/9/10 14:03:15编辑过]

--  作者:shenyl0211
--  发布时间:2017/9/12 15:08:00
--  
还是不能理解甜版的代码含义,麻烦甜版根据我的项目实际给出全套代码和具体要求。谢谢。

1、申请人用电脑在“合同评审”表的“附件”列上传了3个合同文件,位于服务器的物理路径为:
e:\\项目管理系统\\合同评审\\申请人\\A.docx
e:\\项目管理系统\\合同评审\\申请人\\B.doc
e:\\项目管理系统\\合同评审\\申请人\\C.jpg

2、网页文件位于服务器的e:\\web\\合同附件不在该文件夹下,是否必须先把附件下载到e:\\web\\
你说:“做一个下载文件的页面,如 download.htm?key=abc.txt,是否就是在test.htm中增加一个按钮(比如“查看附件”)链接到这个网页?你说的“abc.txt”应该是对应我的“A.docx”,而且是在e:\\web\\下的A.docx,而不是/合同评审/申请人/A.docx”?

3、该条记录的主键值是可以获取的,假设为296

4、下列代码显示“附件”列的内容为:
/合同评审/申请人/A.docx
/合同评审/申请人/B.doc
/合同评审/申请人/C.jpg
    Case "test.htm"
        Dim wb As New weui
        wb.AddForm("","form1","test.htm")
        Dim dr As DataRow = DataTables("合同评审").SQLFind("[_Identify]=296")
        With wb.AddInputGroup("form1","ipg1","附件")
            .AddTextArea("附件",5).Value = dr("附件")
        End With
        With wb.AddButtonGroup("form1","btg1",True)
            .Add("btn1", "审批", "submit")
        End With
        e.WriteString(wb.Build)

5、dr("附件")是已知的,所以可以通过代码提取每个文件名。
在电脑的浏览器测试,可以通过FTP下载文件到硬盘,然后通过PROCESS打开,但手机不行。



--  作者:有点甜
--  发布时间:2017/9/12 16:22:00
--  

2、你文件放在哪里,对应的,这个路径就填写什么

 

 fs = System.IO.File.Open("d:\\" & file, System.IO.FileMode.Open)

 

5、做个按钮,你要查看哪一个文件,对应就访问哪一个路径(红色代码要url编码一下) download.htm?key=/合同评审/申请人/A.docx


--  作者:shenyl0211
--  发布时间:2017/9/12 19:20:00
--  
甜版,执行红色代码时出现下图错误:

图片点击可在新窗口打开查看此主题相关图片如下:2345截图20170912190817.png
图片点击可在新窗口打开查看

    Case "test.htm"
        wb.AddForm("","form1","test.htm")
        dr = DataTables("合同评审").SQLFind("[_Identify]=296")
        With wb.AddInputGroup("form1","ipg1","附件")
            With .AddTextArea("附件",5)
                .Value = dr("附件")
            End With
        End With
        Dim file As String = dr("附件") \'含回车的多行文件名
        Dim Lst() As String = file.Split(vbcrlf) \'文件名数组
        If Lst.Length >0 Then \'如果有附件
            With wb.AddListGroup("form1", "lsg", "查看附件")
                If Lst.Length=1 Then \'只有一个附件
                    .Add("查看附件","查看附件", "", "download.htm?key=" & UrlEncode(lst(0))) \'附件的url编码
                Else
                    For i = 0 To Lst.Length-1
                        .Add("查看附件" & i+1,"查看附件" & i+1, "", "download.htm?key=" & UrlEncode(lst(i)))
                    Next
                End If
            End With
        End If
        With wb.AddButtonGroup("form1","btg1",True)
            .Add("btn1", "审批", "submit")
        End With
    Case "download.htm" \'选择查看附件1
        Dim file As String = e.Values("key") \'file=/合同评审/申请人/A.docx
        file = UrlDecode(file) \'url解码,不解码也可以,file=/合同评审/申请人/A.docx
        Dim file1 As String = file.Replace("/","\\") \'file1=\\合同评审\\申请人\\A.docx
        Dim idx1 As Integer = file1.LastIndexOf("\\") \'文件名中最后一个斜杆位置
        Dim file2 As String = file1.SubString(idx1+1) \'获取不含路径的文件名,file2=A.docx
        Dim file3 As String = "e:\\项目管理系统" & file1 \'附件上传时的服务器物理路径 file3=e:\\项目管理系统\\合同评审\\申请人\\A.docx
        Dim fs As System.IO.FileStream = Nothing
        fs = System.IO.File.Open(file3, System.IO.FileMode.Open) \'用file3
        Dim btFile As Byte() = New Byte(fs.Length - 1) {}
        fs.Read(btFile, 0, Convert.ToInt32(fs.Length))
        fs.Close()
        e.Response.Headers("Content-Disposition") = "attachment;filename=" & file \'用file1~file3都出错,无法继续
        e.Response.ContentType = "application/octet-stream"
        Dim output = e.response.OutputStream
        output.Write(btFile,0,btFile.Length)
        output.Close()
[此贴子已经被作者于2017/9/12 19:34:50编辑过]

--  作者:有点蓝
--  发布时间:2017/9/12 21:27:00
--  
应该是file2=A.docx

以下代码测试通过

Select Case e.Path
    Case "test.htm"
        Dim wb As New weui
        wb.AddForm("","form1","download.htm?file=" & UrlEncode("F2/123.doc"))
        With wb.AddButtonGroup("form1","btg1",True)
            .Add("btn1", "审批", "submit")
        End With
        e.WriteString(wb.Build)
    Case "download.htm"
        Dim file As String = e.Values("file")
        Dim fs As System.IO.FileStream = Nothing
        fs = System.IO.File.Open("f:\\" & file, System.IO.FileMode.Open)
        Dim btFile As Byte() = New Byte(fs.Length - 1) {}
        fs.Read(btFile, 0, Convert.ToInt32(fs.Length))
        fs.Close()
        
        e.Response.Headers("Content-Disposition") = "attachment;filename=" & FileSys.GetName(file)
        \'输出文件格式
        e.Response.C
        
        Dim output = e.response.OutputStream
        output.Write(btFile,0,btFile.Length)
        output.Close()
End Select

--  作者:有点蓝
--  发布时间:2017/9/12 21:27:00
--  
这样也可以

Select Case e.Path
    Case "test.htm"
        Dim wb As New weui
        wb.AddForm("","form1","test.htm")
        With wb.AddButtonGroup("form1","btg1",True)
            .Add("btn1", "审批", "button","download.htm?file=" & UrlEncode("F2/Northwind.mdb"))
        End With
        e.WriteString(wb.Build)
    Case "download.htm"
        Dim file As String = "f:\\" & e.Values("file").replace("/","\\")
        e.WriteFile(file)
End Select

--  作者:shenyl0211
--  发布时间:2017/9/13 10:28:00
--  
原因找到:甜版的代码不支持中文。原来我和蓝版一样,用英文文件名测试过,是通过的。
新问题1(查看附件1是始终正常的):“附件”列的文件名后有其它显示为空白的字符,但可用下列1、2行代码解决(用3、4行代码可以发现问题):
                    For i = 0 To Lst.Length-1
                      1  Dim zj As Integer = lst(i).IndexOf("/")
                      2  lst(i)=lst(i).SubString(zj)
                      3 Dim abc As String = abc & i & lst(i)
                      4  MessageBox.Show(abc)
                        .Add("查看附件" & i+1,"查看附件" & i+1, "", "download.htm?file=" & UrlEncode(lst(i)))
                    Next
新问题2:图片文件不用下载,可直接显示,但是,几K的小图标可以完整显示,而1M的图只显示上面一点。


[此贴子已经被作者于2017/9/13 10:30:29编辑过]

--  作者:有点甜
--  发布时间:2017/9/13 10:51:00
--  

1、得到的file是什么?得到的file3弹出是否正确?

 

最后这里要编码 e.Response.Headers("Content-Disposition") = "attachment;filename=" & UrlEncode(FileSys.GetName(file))

 

2、换个浏览器能否正常显示?单独做个例子发上来看看。


--  作者:shenyl0211
--  发布时间:2017/9/13 11:29:00
--  
甜版:
1、编码后问题都解决了,但出现新的问题,服务器有错误提示:

图片点击可在新窗口打开查看此主题相关图片如下:2345截图20170913110514.png
图片点击可在新窗口打开查看

2、用蓝版的代码测试的,就两行代码,比较简单。但电脑上用google、IE、2345(双内核、3种模式都切换了)浏览器测试、手机上用绿茶浏览器测试,都是一样的结果,只显示上面的一点点图片。


[此贴子已经被作者于2017/9/13 11:30:29编辑过]