VB6如何利用Multipartfile上传文件?有JAVA代码示例

奋斗一生的程序员 2018-05-25 07:26:53
有一个大数据平台提供接口服务,需要上传图片,采用的是Multipartfile提交,并且获得返回值 Data(返回图片标识),有JAVA代码示例,请哪位大侠帮忙用VB6实现 。谢谢。




String filepath = "D:\\mypic.jpg";//图片路径
String POST_URL ="http://file.chinadatapay.com/img/upload?appkey=2712f8c6f0ce9390b9edafc53e9d65b4";
HttpClient httpclient = new DefaultHttpClient();
HttpPost post = new HttpPost(POST_URL);
FileBody fileBody = new FileBody(new File(filepath));
MultipartEntity entity = new MultipartEntity();
entity.addPart("data", fileBody);
post.setEntity(entity);
HttpResponse response = httpclient.execute(post);
HttpEntity r_entity = response.getEntity();
String responseString = EntityUtils.toString(r_entity);
System.out.println("返回结果:" + responseString);
//你需要根据出错的原因判断错误信息,并修改
httpclient.getConnectionManager().shutdown();
...全文
1844 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
舉杯邀明月 2018-05-30
  • 打赏
  • 举报
回复
19楼代码不错!
赵4老师 2018-05-30
  • 打赏
  • 举报
回复
引用 19 楼 wcwtitxu 的回复:
新建一个类模块 Multipart


    Public charset, bomLength, boundary
    Private stream
 
    Private Sub Class_Initialize()
        Me.charset = "UTF-8"
        Me.bomLength = 3
        Set stream = CreateObject("ADODB.Stream")
        stream.Mode = 3
        stream.Type = 1
        stream.Open
        Me.boundary = "----WebKitFormBoundaryomATwYZzgiwmJSgy" ' 随便写一个,够复杂就行
    End Sub
    
    Public Function GetFileData(path)
        With CreateObject("ADODB.Stream")
            .Type = 1
            .Mode = 3
            .Open
            .LoadFromFile path
            .Position = 0
            GetFileData = .Read(-1)
            .Close
        End With
    End Function
     
    Public Function StringFromBytes(bytes, cSet)
        With CreateObject("ADODB.Stream")
            .Type = 1
            .Open
            .Write bytes
            .Position = 0
            .Type = 2
            .charset = cSet
            StringFromBytes = .ReadText()
            .Close
        End With
    End Function
     
    Public Function GetBytes(str, cSet, bomLength)
        With CreateObject("ADODB.Stream")
            .Type = 2
            .Mode = 3
            .charset = cSet
            .Open
            .Position = 0
            .WriteText str
            .Position = 0
            .Type = 1
            .Position = bomLength
            GetBytes = .Read(-1)
            .Close
        End With
    End Function

    Private Sub WriteText(value)
        stream.Write GetBytes(value, Me.charset, Me.bomLength)
    End Sub
     
    Public Function Size()
        Size = stream.Size + Len(Me.boundary)
    End Function
     
    Public Function GetData()
        stream.Position = 0
        With CreateObject("ADODB.Stream")
            .Type = 1
            .Mode = 3
            .Open
            .Position = 0
            .Write stream.Read(-1)
            .Write GetBytes("--" & Me.boundary & "--", Me.charset, Me.bomLength)
            .Position = 0
            GetData = .Read(-1)
            .Close
        End With
        stream.Position = stream.Size
    End Function
     
    Public Sub AddTextEntity(name, value)
        WriteText "--" & Me.boundary & vbCrLf & "Content-Disposition: form-data; name=""" & name & """" & vbCrLf & vbCrLf & value & vbCrLf
    End Sub
     
    Public Sub AddFileEntity(name, filePath, mime)
        WriteText "--" & Me.boundary & vbCrLf
        WriteText "Content-Disposition: form-data; name=""" & name & """; filename=""" & filePath & """" & vbCrLf
        WriteText "Content-Type: " & mime & vbCrLf & vbCrLf
        stream.Write GetFileData(filePath)
        WriteText vbCrLf
    End Sub
     
    Private Sub Class_Terminate()
        stream.Close
        Set stream = Nothing
    End Sub
Private Sub Command1_Click()
    Dim filePath, POST_URL, multidata As Multipart, xhr As Variant
    filePath = "C:\16.jpg"
    POST_URL = "http://file.chinadatapay.com/img/upload"

     
    Set multidata = New Multipart
    multidata.AddTextEntity "appkey", "2712f8c6f0ce9390b9edafc53e9d65b4"
    multidata.AddFileEntity "data", filePath, "image/jpeg"

    Set xhr = CreateObject("WinHttp.WinHttpRequest.5.1")
    xhr.Open "POST", POST_URL, False
    xhr.SetRequestHeader "Content-Length", multidata.Size()
    xhr.SetRequestHeader "Content-Type", "multipart/form-data; boundary=" & multidata.boundary
    xhr.Send multidata.GetData()
     
    MsgBox xhr.ResponseText
End Sub

wcwtitxu 2018-05-30
  • 打赏
  • 举报
回复

图传错了
wcwtitxu 2018-05-30
  • 打赏
  • 举报
回复
新建一个类模块 Multipart


Public charset, bomLength, boundary
Private stream

Private Sub Class_Initialize()
Me.charset = "UTF-8"
Me.bomLength = 3
Set stream = CreateObject("ADODB.Stream")
stream.Mode = 3
stream.Type = 1
stream.Open
Me.boundary = "----WebKitFormBoundaryomATwYZzgiwmJSgy" ' 随便写一个,够复杂就行
End Sub

Public Function GetFileData(path)
With CreateObject("ADODB.Stream")
.Type = 1
.Mode = 3
.Open
.LoadFromFile path
.Position = 0
GetFileData = .Read(-1)
.Close
End With
End Function

Public Function StringFromBytes(bytes, cSet)
With CreateObject("ADODB.Stream")
.Type = 1
.Open
.Write bytes
.Position = 0
.Type = 2
.charset = cSet
StringFromBytes = .ReadText()
.Close
End With
End Function

Public Function GetBytes(str, cSet, bomLength)
With CreateObject("ADODB.Stream")
.Type = 2
.Mode = 3
.charset = cSet
.Open
.Position = 0
.WriteText str
.Position = 0
.Type = 1
.Position = bomLength
GetBytes = .Read(-1)
.Close
End With
End Function

Private Sub WriteText(value)
stream.Write GetBytes(value, Me.charset, Me.bomLength)
End Sub

Public Function Size()
Size = stream.Size + Len(Me.boundary)
End Function

Public Function GetData()
stream.Position = 0
With CreateObject("ADODB.Stream")
.Type = 1
.Mode = 3
.Open
.Position = 0
.Write stream.Read(-1)
.Write GetBytes("--" & Me.boundary & "--", Me.charset, Me.bomLength)
.Position = 0
GetData = .Read(-1)
.Close
End With
stream.Position = stream.Size
End Function

Public Sub AddTextEntity(name, value)
WriteText "--" & Me.boundary & vbCrLf & "Content-Disposition: form-data; name=""" & name & """" & vbCrLf & vbCrLf & value & vbCrLf
End Sub

Public Sub AddFileEntity(name, filePath, mime)
WriteText "--" & Me.boundary & vbCrLf
WriteText "Content-Disposition: form-data; name=""" & name & """; filename=""" & filePath & """" & vbCrLf
WriteText "Content-Type: " & mime & vbCrLf & vbCrLf
stream.Write GetFileData(filePath)
WriteText vbCrLf
End Sub

Private Sub Class_Terminate()
stream.Close
Set stream = Nothing
End Sub


Private Sub Command1_Click()
Dim filePath, POST_URL, multidata As Multipart, xhr As Variant
filePath = "C:\16.jpg"
POST_URL = "http://file.chinadatapay.com/img/upload"


Set multidata = New Multipart
multidata.AddTextEntity "appkey", "2712f8c6f0ce9390b9edafc53e9d65b4"
multidata.AddFileEntity "data", filePath, "image/jpeg"

Set xhr = CreateObject("WinHttp.WinHttpRequest.5.1")
xhr.Open "POST", POST_URL, False
xhr.SetRequestHeader "Content-Length", multidata.Size()
xhr.SetRequestHeader "Content-Type", "multipart/form-data; boundary=" & multidata.boundary
xhr.Send multidata.GetData()

MsgBox xhr.ResponseText
End Sub

舉杯邀明月 2018-05-29
  • 打赏
  • 举报
回复
引用 16 楼 jlmugua 的回复:
[quote=引用 15 楼 zhao4zhong1 的回复:] 前提是厂商提供能跑通的java程序。
问题就在这里,厂商只提供了一楼的文件和代码,再没有其它的了。[/quote] 总感觉你的代码跟10楼提供的方法有点不符。 不过如果你能出1000RMB,我还是可以考虑给你“研究一下”。
赵4老师 2018-05-29
  • 打赏
  • 举报
回复
引用 16 楼 jlmugua 的回复:
[quote=引用 15 楼 zhao4zhong1 的回复:] 前提是厂商提供能跑通的java程序。
问题就在这里,厂商只提供了一楼的文件和代码,再没有其它的了。[/quote] 那就跟厂商说你要换可提供能跑通例子程序的其它竞争对手。
  • 打赏
  • 举报
回复
引用 15 楼 zhao4zhong1 的回复:
前提是厂商提供能跑通的java程序。
问题就在这里,厂商只提供了一楼的文件和代码,再没有其它的了。
  • 打赏
  • 举报
回复
我的11楼代码,运行后,strValue值为:

{
"code":"system_error",
"data":null,
"msg":"Request processing error",
"stacktrace":"Could not parse multipart servlet request; nested exception is org.apache.commons.fileupload.FileUploadException: the request was rejected because no multipart boundary was found",
"success":true
}
若是运行正确,应该是这样的:

{ 
  "code": "10000", 
  "data": "3710595ea2fb4f6699770197fa9b10ba", 
  "msg": "上次成功", 
  "stacktrace": null, 
  "success": true 
}
  • 打赏
  • 举报
回复
为方便各路大侠调试,我把代码都帖上来了,(已删除无关的),核心部分是上传图片,并能返回字符串,字符串的样式在一楼图片中已经提到了。


Private Enum DataEnum
  ResponseText = 1
  ResponseBody = 2
End Enum

Private Sub cmdTestFile_Click()
    On Error GoTo Err1

    Dim fn As Integer
    Dim fbuf() As Byte
    Dim Upload_File As String
    Upload_File = "d:\zhou.jpg"
    '--------打开Adodb.stream 流读取二进制文件-------
    fn = FreeFile()
    ReDim fbuf(FileLen(Upload_File) - 1)
    Open Upload_File For Binary As #fn
    Get #fn, , fbuf
    Close #fn
    
    '这句是核心,可能就错在这里。
    Dim strValue As String '提交图片后,返回字符串
    strValue = PostDataFile("http://file.chinadatapay.com/img/upload", "&appkey=2712f8c6f0ce9390b9edafc53e9d65b4&data=" & ToHexString(fbuf), ResponseText)

    Exit Sub
Err1:
    MsgBox Err.Description
End Sub

Private Function ToHexString(ByRef buf() As Byte) As String
    Dim I As Long, j As Long
    Dim nlen As Long
    Dim tmpHex As String
    Dim HexStr As String
    Dim tmpbuf() As Byte
    nlen = (UBound(buf) + 1) * 2
    ReDim tmpbuf(nlen - 1)
    j = 0
    For I = 0 To UBound(buf)
        HexStr = Hex(buf(I))
        If Len(HexStr) = 1 Then HexStr = "0" & HexStr
        tmpbuf(j) = Asc(Mid(HexStr, 1, 1))
        j = j + 1
        tmpbuf(j) = Asc(Mid(HexStr, 2, 1))
        j = j + 1
    Next
    ToHexString = StrConv(tmpbuf, vbUnicode)
End Function

Private Function PostDataFile(ByVal strurl As String, ByVal StrData As String, ByVal DataStic As DataEnum) As Variant
    On Error GoTo Err:
    Dim xmlhttp As Object
    Dim DataS As String
    Dim DataB() As Byte
    
    Set xmlhttp = CreateObject("Microsoft.XMLHTTP")
    xmlhttp.Open "POST", strurl, True
    xmlhttp.SetRequestHeader "Content-Length", Len(PostDataFile)
    xmlhttp.SetRequestHeader "Content-Type", "multipart/form-data"
    xmlhttp.Send strurl & StrData
    
    Do Until xmlhttp.ReadyState = 4
      DoEvents
    Loop
    '-----------------------------函数返回
    Select Case DataStic
    Case ResponseText
      '--------------------------------直接返回字符串
      DataS = xmlhttp.ResponseText
      PostDataFile = DataS
    Case ResponseBody
      '--------------------------------直接返回二进制
      DataB = xmlhttp.ResponseBody
      PostDataFile = DataB
    Case ResponseBody + ResponseText
      '---------------------------二进制转字符串[直接返回字串出现乱码时尝试]
      DataS = BytesToStr(xmlhttp.ResponseBody)
      PostDataFile = DataS
    Case Else
      '--------------------------------无效的返回
      PostDataFile = ""
    End Select
    '------------------------------------释放空间
    Set xmlhttp = Nothing
    Exit Function
Err:
    MsgBox Err.Description, "PostDataFile"
    PostDataFile = ""
End Function
  • 打赏
  • 举报
回复
引用 13 楼 zhao4zhong1 的回复:
在你的环境下实际运行java示例并看到正确的最终结果,表示你已经成功了一半。
我本人不会java,也不熟悉wireshark。
赵4老师 2018-05-28
  • 打赏
  • 举报
回复
引用 14 楼 jlmugua 的回复:
[quote=引用 13 楼 zhao4zhong1 的回复:] 在你的环境下实际运行java示例并看到正确的最终结果,表示你已经成功了一半。
我本人不会java,也不熟悉wireshark。[/quote] 人民币1000我帮你。前提是厂商提供能跑通的java程序。
赵4老师 2018-05-28
  • 打赏
  • 举报
回复
在你的环境下实际运行java示例并看到正确的最终结果,表示你已经成功了一半。 然后你 用wireshark抓包, 对比 使用能上传成功的java代码上传图片 和 使用不能上传图片的VB6上传图片 两者之间的区别。 然后修改VB6相关语句让抓包结果一致。 你就全部成功了。
  • 打赏
  • 举报
回复
引用 4 楼 chewinggum 的回复:
哦,是要VB6实现,话说有开发测试地址么?总不能往他生产地址上弄吧
我将我写的VB6,发上来了。测试不对。 http://http:/www.notery.cn/vb6_picload.rar
无·法 2018-05-25
  • 打赏
  • 举报
回复
脆皮大雪糕 2018-05-25
  • 打赏
  • 举报
回复
走错了吧,出门左拐JAVA版
脆皮大雪糕 2018-05-25
  • 打赏
  • 举报
回复
哦,是要VB6实现,话说有开发测试地址么?总不能往他生产地址上弄吧
舉杯邀明月 2018-05-25
  • 打赏
  • 举报
回复
一开始,想到用Microsoft.XMLHTTP对象来操作,细想了下觉得不能完成…… 围观一下好了。
赵4老师 2018-05-25
  • 打赏
  • 举报
回复
不要做A语言代码修改为B语言代码的无用功。 也不要做用A语言代码直接调用B语言代码库这样复杂、这样容易出错的傻事。 只需让A、B语言代码的输入输出重定向到文本文件,或修改A、B语言代码让其通过文本文件输入输出。 即可很方便地让A、B两种语言之间协调工作。 比如: A将请求数据写到文件a.txt,写完后改名为aa.txt B发现aa.txt存在时,读取其内容,调用相应功能,将结果写到文件b.txt,写完后删除aa.txt,再将b.txt改名为bb.txt A发现bb.txt存在时,读取其内容,读完后删除bb.txt 以上A可以替换为任何一种开发语言或开发环境,B可以替换为任何一种与A不同的开发语言或开发环境。 除非A或B不支持判断文件是否存在、文件读写和文件更名。 但是谁又能举出不支持判断文件是否存在、文件读写和文件更名的开发语言或开发环境呢? 可以将临时文件放在RamDisk上提高效率减少磨损磁盘。 数据的结构很复杂的话,文本文件的格式问题可参考json或xml 共享临时文本文件这种进程之间的通讯方法相比其它方法的优点有很多,下面仅列出我现在能想到的: ·进程之间松耦合 ·进程可在同一台机器上,也可跨机,跨操作系统,跨硬件平台,甚至跨国。 ·方便调试和监视,只需让第三方或人工查看该临时文本文件即可。 ·方便在线开关服务,只需删除或创建该临时文本文件即可。 ·方便实现分布式和负载均衡。 ·方便队列化提供服务,而且几乎不可能发生队列满的情况(除非硬盘空间满) ·…… “跨语言、跨机,跨操作系统,跨硬件平台,跨国,跨*.*的”苦海无边, 回头是“使用共享纯文本文件进行信息交流”的岸!
舉杯邀明月 2018-05-25
  • 打赏
  • 举报
回复
引用 8 楼 jlmugua 的回复:
[quote=引用 6 楼 Chen8013 的回复:] ...
引用 7 楼 chewinggum 的回复:
...
测试成功的标志,即运行后返回JSON字符串,在一楼附图中就已经有了。我把图中的代码帖上来
SUCCESS RESPONSE: 
{ 
  "code": "10000", 
  "data": "3710595ea2fb4f6699770197fa9b10ba", 
  "msg": "上次成功", 
  "stacktrace": null, 
  "success": true 
} 
而我的vb6_picload.rar 代码,也不知道怎么能让图片上传成功,所以代码就是错的,它运行后返回值如下:

{"code":"system_error","data":null,"msg":"Request processing error",
"stacktrace":"Could not parse multipart servlet request; nested exception is org.apache.commons.fileupload.FileUploadException: the request was rejected because no multipart boundary was found",
"success":true}
[/quote] 我在6楼就是说,让你把VB6代码执行后的反馈结果贴出来。 看样子,应该是没有把图片的“具体数据”发出去,只是发了个“文件路径”的那些文本信息。 我也不清楚如何用这个对象,去实现“文件数据上传”。 目前我帮不上忙。 
  • 打赏
  • 举报
回复
引用 6 楼 Chen8013 的回复:
...
引用 7 楼 chewinggum 的回复:
...
测试成功的标志,即运行后返回JSON字符串,在一楼附图中就已经有了。我把图中的代码帖上来
SUCCESS RESPONSE: 
{ 
  "code": "10000", 
  "data": "3710595ea2fb4f6699770197fa9b10ba", 
  "msg": "上次成功", 
  "stacktrace": null, 
  "success": true 
} 
而我的vb6_picload.rar 代码,也不知道怎么能让图片上传成功,所以代码就是错的,它运行后返回值如下:

{"code":"system_error","data":null,"msg":"Request processing error",
"stacktrace":"Could not parse multipart servlet request; nested exception is org.apache.commons.fileupload.FileUploadException: the request was rejected because no multipart boundary was found",
"success":true}
加载更多回复(2)

7,763

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧