注册 登录
编程论坛 VFP论坛

vfp 如何模拟post multipart/form-data上传参数和图片

ljb8864 发布于 2023-06-04 14:01, 1503 次点击
主要图片不好上传,vb可以用ado.stream和StrConv(S1, vbFromUnicode) 和leftB(),但vfp不行.
哪位大神帮下!

[此贴子已经被作者于2023-6-4 14:22编辑过]

12 回复
#2
吹水佬2023-06-04 15:11
multipart/form-data:指定传输数据为二进制类型
VFP通常的“二进制类型”是0h开头十六进制码表达的字符串
可以用CREATEBINARY()将字符型数据转换为二进制字符型数据

#3
ljb88642023-06-04 17:50
回复 2楼 吹水佬
------WebKitFormBoundaryAx0QwuMECh2eIreV
Content-Disposition: form-data; name="jobNo"

022289
------WebKitFormBoundaryAx0QwuMECh2eIreV
Content-Disposition: form-data; name="fileItemName"; filename="人脸.jpg"
Content-Type: application/octet-stream
Content-Transfer-Encoding: binary

<<filrtostr(x)>>
------WebKitFormBoundaryAx0QwuMECh2eIreV--


send(createbin(...))
返回↓

Array
(
    [flag] =>
    [message] => 上传失败:Bogus Huffman table definition `D:/www/pics/101/yc/100/008/65_1V20MQ.jpg' @ error/jpeg.c/JPEGErrorHandler/347#0 D:\www\web\imgServerYuanli\protected\controller\UploadController.php(712): Imagick->__construct('D:/www/pics/101...')
#1 D:\www\web\imgServerYuanli\protected\controller\UploadController.php(41): UploadController->checkinUpload2()
#2 D:\www\web\imgServerYuanli\dooFrame\app\DooWebApp.php(85): UploadController->serviceAction()
#3 D:\www\web\imgServerYuanli\dooFrame\app\DooWebApp.php(34): DooWebApp->route_to()
#4 D:\www\web\imgServerYuanli\index.php(27): DooWebApp->run()
#5 {main}
    [url] => /101/yc/100/008/65_1V20MQ.jpg
    [ret] => -1
)
Array
(
    [jobNo] => 022289
)
Array
(
)
#4
ljb88642023-06-04 17:52
jonNo 传上了,图没有
#5
吹水佬2023-06-04 19:13
不明具体上载代码
#6
ljb88642023-06-04 19:45
回复 5楼 吹水佬
Boundary= "----WebKitFormBoundaryAx0QwuMECh2eIreV"

TEXT TO cData TEXTMERGE NOSHOW PRETEXT  3
--<<Boundary>>
Content-Disposition: form-data; name="jobNo"

<<"022289">>
--<<Boundary>>
Content-Disposition: form-data; name="fileItemName"; filename="<<LOWER(cFileName)>>"
Content-Type: image/jpg

<<filetostr(cfile)>>
--<<Boundary>>--

ENDTEXT
cData=CREATEBINARY(cData)

objHTTP = CREATEOBJECT("MSXML2.XMLHTTP")
objHTTP.Open("POST", strWebserviceURL, 0)
objHTTP.setRequestHeader("content-type", "multipart/form-data; boundary="+Boundary+";")  

objHTTP.Send(  cData  )
#7
吹水佬2023-06-04 22:16
猜测一下,试试:
cFileName = "D:\temp\人脸.jpg"

Boundary= "----WebKitFormBoundaryAx0QwuMECh2eIreV"

TEXT TO cData TEXTMERGE NOSHOW PRETEXT 3
--<<Boundary>>
Content-Disposition: form-data; name="jobNo"

<<"022289">>
--<<Boundary>>
Content-Disposition: form-data; name="fileItemName"; filename="<<LOWER(cFileName)>>"
Content-Type: image/jpg


ENDTEXT    && 这时cData以0h0D0A0D0A结束
cData = STRCONV(cData,5) + CREATEBINARY(FILETOSTR(cFileName))
cData = cData + STRCONV(0h0D0A+"--"+Boundary+"--"+0h0D0A,5)
objHTTP = CREATEOBJECT("MSXML2.ServerXMLHTTP")
objHTTP.Open("POST", strWebserviceURL, 0)
objHTTP.setRequestHeader("Content-Type", "multipart/form-data; boundary="+Boundary)  
objHTTP.setRequestHeader("Content-Length", LEN(cData))
objHTTP.send(cData)
**objHTTP.waitForResponse
#8
ljb88642023-06-04 22:43
回复 7楼 吹水佬
cData = CREATEBINARY(cData)+ CREATEBINARY(FILETOSTR(cFileName))
cData = cData +  CREATEBINARY(0h0D0A+"--"+Boundary+"--"+0h0D0A)

以上成功了,感恩大师
你加的0h0D0A什麼意思?
Array
(
    [flag] =>
    [message] => 上传成功
    [url] => /101/yc/100/008/68_I2V25A.jpg
    [ret] => 1
)
Array
(
    [jobNo] => 022289
)
Array
(
)
#9
吹水佬2023-06-04 22:59
0h0D0A 相当于CHR(13)+CHR(10)的二进制数据字符串
#10
ljb88642023-06-04 23:03
回复 9楼 吹水佬
奇怪为何《》赋值就不行
#11
ljb88642023-06-05 05:52
可能text 对文件处理了或裁了一部分
#12
吹水佬2023-06-05 06:26
以下是引用ljb8864在2023-6-4 22:43:27的发言:

cData = CREATEBINARY(cData)+ CREATEBINARY(FILETOSTR(cFileName))
cData = cData +  CREATEBINARY(0h0D0A+"--"+Boundary+"--"+0h0D0A)


都用CREATEBINARY转换可以的话,原来的问题可能出在HTTP协议报文格式。
7楼的代码中用注释强调了一点:“这时cData以0h0D0A0D0A结束”
通常“报文头”与“报文数据”是用0h0D0A0D0A来分隔。
试试在Content-Type: image/jpg下面加多一空行:
TEXT TO cData TEXTMERGE NOSHOW PRETEXT 3
.......
Content-Type: image/jpg


<<filetostr(cfile)>>
--<<Boundary>>--

ENDTEXT



#13
aroffice2023-08-11 12:38
以下是引用吹水佬在2023-6-4 22:16:46的发言:

猜测一下,试试:
cFileName = "D:\temp\人脸.jpg"

Boundary= "----WebKitFormBoundaryAx0QwuMECh2eIreV"

TEXT TO cData TEXTMERGE NOSHOW PRETEXT 3
--<<Boundary>>
Content-Disposition: form-data; name="jobNo"

<<"022289">>
--<<Boundary>>
Content-Disposition: form-data; name="fileItemName"; filename="<<LOWER(cFileName)>>"
Content-Type: image/jpg


ENDTEXT    && 这时cData以0h0D0A0D0A结束
cData = STRCONV(cData,5) + CREATEBINARY(FILETOSTR(cFileName))
cData = cData + STRCONV(0h0D0A+"--"+Boundary+"--"+0h0D0A,5)
objHTTP = CREATEOBJECT("MSXML2.ServerXMLHTTP")
objHTTP.Open("POST", strWebserviceURL, 0)
objHTTP.setRequestHeader("Content-Type", "multipart/form-data; boundary="+Boundary)  
objHTTP.setRequestHeader("Content-Length", LEN(cData))
objHTTP.send(cData)
**objHTTP.waitForResponse

相问一下上传文件(XLS)是否可以这样使用呢?
1