注册 登录
编程论坛 VFP论坛

VFP 上传文件到WEB服务器

aroffice 发布于 2022-11-19 21:48, 2194 次点击
在一个登录后的网页中,点击选择文件,选中特定文件,然后上传。
我想在VFP自动选中文件,然后上传。有什么好的办法不?
前面我用的是
POWINHTTP = CREATEOBJECT("WinHttp.WinHttpRequest.5.1")
并在VFP中获取相关信息生成POST登录信息的,登录后就可以访问上传文件页面了。
这个网页是在内网之中。
15 回复
#2
sam_jiang2022-11-19 23:09
你可以参考这篇文章。。。
https://blog.
#3
aroffice2022-11-20 11:19
以下是引用sam_jiang在2022-11-19 23:09:15的发言:

你可以参考这篇文章。。。
https://blog.


我现在已经在前面做好了登录,现在不知道如何加入文件的二进制数据到上传信息中。

                    YMID1=STREXTRACT(POWINHTTP.RESPONSETEXT, [__VIEWSTATE" value="], [" />])
                    YMID2=STREXTRACT(POWINHTTP.RESPONSETEXT, [__EVENTVALIDATION" value="], [" />])
&&设定数据分隔
                    POSTFGF="----WebKitFormBoundarySSoR4BK8bRgIJUh0"

**重新构建POST数据
                    POSTDATA="--"+POSTFGF+CHR(13)
                    POSTDATA=POSTDATA+[Content-Disposition: form-data; name="__VIEWSTATE"]+CHR(13)+CHR(13)+ZHURL(YMID1)+CHR(13)
                    POSTDATA=POSTDATA+"--"+POSTFGF+CHR(13)
                    POSTDATA=POSTDATA+[Content-Disposition: form-data; name="__EVENTVALIDATION"]+CHR(13)+CHR(13)+ZHURL(YMID2)+CHR(13)
                    POSTDATA=POSTDATA+"--"+POSTFGF+CHR(13)
                    POSTDATA=POSTDATA+[Content-Disposition: form-data; name="ctl00$ContentPlaceHolder1$UpFile"; filename="]+[20221119202630ks.xls]+["]+CHR(13)&&文件名
                    POSTDATA=POSTDATA+[ Content-Type: application/vnd.ms-excel]+CHR(13)
                    POSTDATA=POSTDATA+FILETOSTR("20221119202630ks.xls")+CHR(13)&&加入文件的二进制数据
                    POSTDATA=POSTDATA+"--"+POSTFGF+CHR(13)
                    POSTDATA=POSTDATA+[Content-Disposition: form-data; name="ctl00$ContentPlaceHolder1$UploadBtn"]+CHR(13)+CHR(13)
                    POSTDATA=POSTDATA+"--"+POSTFGF+CHR(13)
                    STRTOFILE(POSTDATA,"POSTdata.TXT")

                    POWINHTTP.OPEN("POST", SURL, .F.)
                    POWINHTTP.SETREQUESTHEADER("Content-Type", "multipart/form-data; boundary="+POSTFGF)
*!*                                POWINHTTP.SETREQUESTHEADER ("Content-Length",LEN(POSTSTR))
                    POWINHTTP.SETREQUESTHEADER("Referer", SURLR )
                    POWINHTTP.SEND(POSTSTR)  && 提交表单进行登录
#4
sam_jiang2022-11-20 12:18
sendfile.prg

TEXT to lcXmlString
<?xml version="1.0"?>
<root>
</root>
ENDTEXT

*// 创建 ADO-stream 对象
ado_stream = createobject("ADODB.Stream")
*// 创建包含默认头信息和根节点的 XML文档
xml_dom = CreateObject("Msxml2.DOMDocument.4.0")
*createobject("MSXML2.DOMDocument")
xml_dom.loadXML(lcXmlString)
*// 指定数据类型
xml_dom.documentElement.setAttribute("xmlns:dt", "urn:schemas-microsoft-com:datatypes")
*// 创建一个新节点,设置其为二进制数据节点
l_node1 = xml_dom.createElement("file1")
l_node1.dataType = "bin.base64"
*// 打开Stream对象,读源文件
ado_stream.Type = 1 &&; // 1=adTypeBinary  
ado_stream.Open()
ado_stream.LoadFromFile("c:/aaa.zip")
*// 将文件内容存入XML节点
l_node1.nodeTypedvalue = ado_stream.Read(-1)  &&; // -1=adReadAll
ado_stream.Close()
xml_dom.documentElement.appendChild(l_node1)
*// 可以创建多个二进制节点,一次上传多个文件
*// 把XML文档发送到Web服务器
xmlhttp = createobject("Microsoft.XMLHTTP")
xmlhttp.open("POST","http://9dvfp.,.f.)
xmlhttp.send(xml_dom)
MESSAGEBOX(xmlhttp.ResponseBody)
RELEASE xmlhttp
#5
aroffice2022-11-20 13:09
回复 4楼 sam_jiang
用这个上传提示不是要求的文件格式,上传失败。无论是XLS文件还是压缩成zip
#6
sam_jiang2022-11-25 03:25
回复 5楼 aroffice
把错误信息截图发上来看看,还有你的upload.asp
#7
厨师王德榜2022-11-25 09:18
以前做过类似的,但是以前我遇到的情况是,服务器不只有web服务,web服务只是针对前台的,
实际它后台还配置有ftp或mysql服务,上传文件实际是用ftp协议或sql通道传入的,
像这种只有web的,我还未做过.
不妨把服务器的ftp也开通吧,上传文件通过ftp,前台web调用某个文件的仍是自己那一套逻辑,
比如 web要调用A1.pdf ,对web来说,是打开 D:/hpg/pdf/A1.pdf ,对上传ftp来说,
是上传到:ftp://ip/root/hpg/pdf/A1.pdf 虽然实际上两者都是指向同一个文件,但是操作上
两者互相不干扰,这样岂不是更好.

[此贴子已经被作者于2022-11-25 09:19编辑过]

#8
aroffice2022-11-25 13:35
回复 7楼 厨师王德榜
这个服务器不在我的掌握之中,我如果掌握了一切都要办了
#9
sam_jiang2022-11-25 20:19
前端的upload.asp里要有设置允许上传的文件格式!
#10
aroffice2022-11-29 13:14
回复 9楼 sam_jiang
只允许上传xls或zip格式
#11
aroffice2022-11-29 13:16
回复 4楼 sam_jiang
还有上传时必须要引用原来页面中的那个值。
#12
sam_jiang2022-12-04 12:05
***uploadtest.html***
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>菜鸟教程()</title>
</head>
<body>

<form action="upload_file.php" method="post" enctype="multipart/form-data">
    <label for="file">文件名:</label>
    <input type="file" name="file" id="file"/><br/>
    <input type="submit" name="submit" value="提交">
</form>
<iframe id="iframe" src="" style="display: none;"/></iframe>

</body>
</html>

***upload_file.php***
<?php
echo "uploaded file type:" . $_FILES["file"]["type"] . "<br />";
if (($_FILES["file"]["type"] == "image/gif")
|| ($_FILES["file"]["type"] == "image/jpeg")
|| ($_FILES["file"]["type"] == "image/bmp")
|| ($_FILES["file"]["type"] == "image/pjpeg")
|| ($_FILES["file"]["type"] == "application/pdf")
|| ($_FILES["file"]["type"] == "application/octet-stream") //rar file
|| ($_FILES["file"]["type"] == "application/zip"))
//&& ($_FILES["file"]["size"] < 102400000))
  {
  if ($_FILES["file"]["error"] > 0)
    {
    echo "Return Code: " . $_FILES["file"]["error"] . "<br />";
    }
  else
    {
    echo "Upload: " . $_FILES["file"]["name"] . "<br />";
    echo "Type: " . $_FILES["file"]["type"] . "<br />";
    echo "Size: " . ($_FILES["file"]["size"] / 1024) . " Kb<br />";
    echo "Temp file: " . $_FILES["file"]["tmp_name"] . "<br />";

    if (file_exists("./upload/" . $_FILES["file"]["name"]))
      {
      echo $_FILES["file"]["name"] . " already exists. ";
      }
    else
      {
      move_uploaded_file($_FILES["file"]["tmp_name"],"./upload/" . $_FILES["file"]["name"]);

      echo "Stored in: " . "./upload/" . $_FILES["file"]["name"];
      }
    }
  }
else
  {
  echo "Invalid file"  ."<br/>";

  echo "Return error Code: " . $_FILES["file"]["error"] . "<br />";
  }
?>
#13
plsword2023-03-01 10:08
以下是引用aroffice在2022-11-20 11:19:29的发言:



我现在已经在前面做好了登录,现在不知道如何加入文件的二进制数据到上传信息中。

                    YMID1=STREXTRACT(POWINHTTP.RESPONSETEXT, [__VIEWSTATE" value="], [" />])
                    YMID2=STREXTRACT(POWINHTTP.RESPONSETEXT, [__EVENTVALIDATION" value="], [" />])
&&设定数据分隔
                    POSTFGF="----WebKitFormBoundarySSoR4BK8bRgIJUh0"

**重新构建POST数据
                    POSTDATA="--"+POSTFGF+CHR(13)
                    POSTDATA=POSTDATA+[Content-Disposition: form-data; name="__VIEWSTATE"]+CHR(13)+CHR(13)+ZHURL(YMID1)+CHR(13)
                    POSTDATA=POSTDATA+"--"+POSTFGF+CHR(13)
                    POSTDATA=POSTDATA+[Content-Disposition: form-data; name="__EVENTVALIDATION"]+CHR(13)+CHR(13)+ZHURL(YMID2)+CHR(13)
                    POSTDATA=POSTDATA+"--"+POSTFGF+CHR(13)
                    POSTDATA=POSTDATA+[Content-Disposition: form-data; name="ctl00$ContentPlaceHolder1$UpFile"; filename="]+[20221119202630ks.xls]+["]+CHR(13)&&文件名
                    POSTDATA=POSTDATA+[ Content-Type: application/vnd.ms-excel]+CHR(13)
                    POSTDATA=POSTDATA+FILETOSTR("20221119202630ks.xls")+CHR(13)&&加入文件的二进制数据
                    POSTDATA=POSTDATA+"--"+POSTFGF+CHR(13)
                    POSTDATA=POSTDATA+[Content-Disposition: form-data; name="ctl00$ContentPlaceHolder1$UploadBtn"]+CHR(13)+CHR(13)
                    POSTDATA=POSTDATA+"--"+POSTFGF+CHR(13)
                    STRTOFILE(POSTDATA,"POSTdata.TXT")

                    POWINHTTP.OPEN("POST", SURL, .F.)
                    POWINHTTP.SETREQUESTHEADER("Content-Type", "multipart/form-data; boundary="+POSTFGF)
*!*                                POWINHTTP.SETREQUESTHEADER ("Content-Length",LEN(POSTSTR))
                    POWINHTTP.SETREQUESTHEADER("Referer", SURLR )
                    POWINHTTP.SEND(POSTSTR)  && 提交表单进行登录

_________________
个人认为问题应该出在FILETOSTR上,form-data上传文件不能直接用FILETOSTR生成的字串因为涉及到二进制的问题,式着用一下CREATEBINARY(FILETOSTR("文件名"))试试
CREATEBINARY:将 Visual FoxPro 字符型数据转换为二进制字符型数据
#14
iswith2023-03-01 11:09
这就是我们以前搞的头文一体,实在看不下去,POSTDATA与header还分开写,不管是自己看还是维护都方便,CREATEBINARY(FILETOSTR("20221119202630ks.xls"))加个专二进制看看
#15
ljb88642023-06-04 19:40
CREATEBINARY(FILETOSTR没用
#16
sam_jiang2025-01-05 14:56
楼主有没有解决问题?我最近也碰到这个问题,向微信公众号上传图片时,碰到41005错误,一筹莫展。。。
1