2

另一个网站使用 POST 方法向我发送数据。

我想获取这些数据并将其插入数据库。

经过一些在线研究,我得出结论 ADODB.Stream 应该为我完成这项工作。

我在获取二进制数据方面没有问题Request.TotalBytes。使用以下代码,我没有收到错误,但它也没有保存数据。所以我一定是对 ADODB 流做错了。

    tot_bytes = Request.TotalBytes

    Set BinaryStream = CreateObject("ADODB.Stream")
    BinaryStream.Mode = 3
    BinaryStream.Type = 1
    BinaryStream.Open       
    gBinaryData = BinaryStream.Write(tot_bytes) 
    BinaryStream.Close
    Set BinaryStream = Nothing

    SQL = "INSERT INTO STATUSES (StatusMessage, StatusDateEntered) VALUES ('"& gBinaryData &"', '"& FormatDateMySQL(NOW) &"')"                                  
    Set objAddC = objConn.execute(SQL)

.

Following a successful subscription, Facebook will proceed to call your endpoint every time that there are changes (to the chosen fields or connections). For each update, it will make an HTTP POST request.

The request will have content type of application/json and the body will comprise a JSON-encoded string containing one or more changes.

Note for PHP developers: In PHP, to get the encoded data you would use the following code:

$data = file_get_contents("php://input");
$json = json_decode($data);
4

2 回答 2

5

首先,Write方法不返回任何内容,实际上它只是一个子程序。Request.TotalBytes 只是请求的长度(以字节为单位)。当您需要将请求数据读取为字节数组时,您应该使用 Request.BinaryRead(length of bytes)。因此,在 Stream 对象中,您需要在写入字节并将位置设置为开始之后 使用Read方法读取所有字节。

但是,如果您必须将数据存储为二进制,在这种情况下似乎没有必要。
我假设您需要将数据作为文本,很可能是 json 字符串。因此,您应该将数据从字节转换为字符串。

请注意,您需要处理有关总字节数的异常。如果请求不包含任何内容,Request.TotalBytes则等于零并且因为Request.BinaryRead期望大于零且小于或等于总字节数的数字会发生错误。

Dim tot_bytes, postData
    tot_bytes = Request.TotalBytes
If tot_bytes > 0 Then
    With Server.CreateObject("Adodb.Stream")
        .Charset = "utf-8" 'specify the request encoding
        .Type = 1 'adTypeBinary, a binary stream
        .Open
        .Write Request.BinaryRead(tot_bytes) 'Write bytes
        .Position = 0 ' set position to the start
        .Type = 2 ' adTypeText, stream type is text now
        postData = .ReadText 'read all text
        .Close
    End With
    With Server.CreateObject("Adodb.Recordset")
        .Open "STATUSES", objConn , , 3
        .AddNew
        .Fields("StatusMessage").Value = postData
        .Fields("StatusDateEntered").Value = Now()
        .Update
        .Close
    End With
    Response.Write "data stored successfully"
Else
    Response.Write "no post data"
End If
于 2013-03-17T23:08:03.197 回答
1

除了直接将数据插入这样的数据库(可能的 sql 注入)是一个非常糟糕的主意之外,您如何发布表单数据?CLassic ASP 也不能直接处理二进制数据。所以这根本行不通。

所以无论你发布什么,首先你必须确保你使用 form 发布enctype="multiform/data"。要将数据放入对象中,请尝试以下操作:

byteArray = Request.BinaryRead(Request.TotalBytes)

但是要处理它,存储到数据库或保存到文件,您需要一个组件,例如http://www.motobit.com/help/scptutl/upload.asp或尝试查看这篇文章(特别是当您上传更多只有一个文件): http: //www.codeguru.com/csharp/.net/net_asp/article.php/c19297/Pure-ASP-File-Upload.htm

编辑:Antonin Fuller 还制作了一个示例 ASP 代码,而不使用他的 DLL。也试试这个:

Private Function RSBinaryToString(xBinary)
'Antonin Foller, http://www.motobit.com
'RSBinaryToString converts binary data (VT_UI1 | VT_ARRAY Or MultiByte string)
'to a string (BSTR) using ADO recordset

Dim Binary
'MultiByte data must be converted To VT_UI1 | VT_ARRAY first.
If vartype(xBinary)=8 Then Binary = MultiByteToBinary(xBinary) Else Binary = xBinary

Dim RS, LBinary
Const adLongVarChar = 201
Set RS = CreateObject("ADODB.Recordset")
LBinary = LenB(Binary)

If LBinary>0 Then
    RS.Fields.Append "mBinary", adLongVarChar, LBinary
    RS.Open
    RS.AddNew
    RS("mBinary").AppendChunk Binary 
    RS.Update
    RSBinaryToString = RS("mBinary")
Else  
    RSBinaryToString = ""
End If
End Function

在此处查看更多信息:http ://www.motobit.com/tips/detpg_binarytostring/

最后,您应该获取流、转换它并使用它。

于 2013-03-17T18:15:21.520 回答