2

別の Web サイトから 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(バイトの長さ) を使用する必要があります。そのため、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などのコンポーネントが必要です。 1 つのファイルのみ): http://www.codeguru.com/csharp/.net/net_asp/article.php/c19297/Pure-ASP-File-Upload.htm

編集: Antonin Fuller は、DLL を使用しないサンプル ASP コードも作成しました。これも試してください:

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 に答える