2015-10-21 6 views
5

Ich versuche, eine Bilddatei auf OCR Site hochladen, aber die PDF-Datei wird nicht auf die Website hochgeladen.Laden Sie eine Datei über <input input> im HTML-Formular mit VBA

ich den folgenden Code verwenden, es zu erreichen und unten ist das HTML-Segment:

Sub DownPDF() 

    Dim FileName As String: FileName = "C:\Users\310217955\Documents\pdfdown\SGSSI001_HL1464_2011.pdf" 
    Dim DestURL As String: DestURL = "https://www.newocr.com/" 
    Dim FieldName As String: FieldName = "userfile" 
    Call UploadFile(DestURL, FileName, FieldName) 

End Sub 


'******************* upload - begin 
'Upload file using input type=file 
Sub UploadFile(DestURL, FileName, FieldName) 
    'Boundary of fields. 
    'Be sure this string is Not In the source file 
    Const Boundary = "---------------------------" 

    Dim FileContents, FormData 
    'Get source file As a binary data. 
    FileContents = GetFile(FileName) 

    'Build multipart/form-data document 
    FormData = BuildFormData(FileContents, Boundary, FileName, FieldName) 

    'Post the data To the destination URL 
    IEPostBinaryRequest DestURL, FormData, Boundary 
End Sub 

'Build multipart/form-data document with file contents And header info 
Function BuildFormData(FileContents, Boundary, FileName, FieldName) 
    Dim FormData, Pre, Po 
    Const ContentType = "application/upload" 

    'The two parts around file contents In the multipart-form data. 
    Pre = "--" + Boundary + vbCrLf + mpFields(FieldName, FileName, ContentType) 
    Po = vbCrLf + "--" + Boundary + "--" + vbCrLf 

    'Build form data using recordset binary field 
    Const adLongVarBinary = 205 
    Dim RS: Set RS = CreateObject("ADODB.Recordset") 
    RS.Fields.Append "b", adLongVarBinary, Len(Pre) + LenB(FileContents) + Len(Po) 
    RS.Open 
    RS.AddNew 
    Dim LenData 
    'Convert Pre string value To a binary data 
    LenData = Len(Pre) 
    RS("b").AppendChunk (StringToMB(Pre) & ChrB(0)) 
    Pre = RS("b").GetChunk(LenData) 
    RS("b") = "" 

    'Convert Po string value To a binary data 
    LenData = Len(Po) 
    RS("b").AppendChunk (StringToMB(Po) & ChrB(0)) 
    Po = RS("b").GetChunk(LenData) 
    RS("b") = "" 

    'Join Pre + FileContents + Po binary data 
    RS("b").AppendChunk (Pre) 
    RS("b").AppendChunk (FileContents) 
    RS("b").AppendChunk (Po) 
    RS.Update 
    FormData = RS("b") 
    RS.Close 
    BuildFormData = FormData 
End Function 

'sends multipart/form-data To the URL using IE 
Function IEPostBinaryRequest(URL, FormData, Boundary) 
    'Create InternetExplorer 
    Dim IE: Set IE = CreateObject("InternetExplorer.Application") 

    'You can uncoment Next line To see form results 
    IE.Visible = True 

    'Send the form data To URL As POST multipart/form-data request 
    IE.Navigate URL, , , FormData, _ 
    "Content-Type: multipart/form-data; boundary=" + Boundary + vbCrLf 

    Do While IE.Busy Or IE.readyState <> 4 
    Wait 1, "Upload To " & URL 
    Loop 

    'Get a result of the script which has received upload 
    On Error Resume Next 
    IEPostBinaryRequest = IE.document.body.innerHTML 
    'IE.Quit 
End Function 

'Infrormations In form field header. 
Function mpFields(FieldName, FileName, ContentType) 
    Dim MPTemplate 'template For multipart header 
    MPTemplate = "Content-Disposition: form-data; name=""{field}"";" + _ 
    " filename=""{file}""" + vbCrLf + _ 
    "Content-Type: {ct}" + vbCrLf + vbCrLf 
    Dim Out 
    Out = Replace(MPTemplate, "{field}", FieldName) 
    Out = Replace(Out, "{file}", FileName) 
    mpFields = Replace(Out, "{ct}", ContentType) 
End Function 


Sub Wait(Seconds, Message) 
    On Error Resume Next 
    CreateObject("wscript.shell").Popup Message, Seconds, "", 64 
End Sub 


'Returns file contents As a binary data 
Function GetFile(FileName) 
    Dim Stream: Set Stream = CreateObject("ADODB.Stream") 
    Stream.Type = 1 'Binary 
    Stream.Open 
    Stream.LoadFromFile FileName 
    GetFile = Stream.Read 
    Stream.Close 
End Function 

'Converts OLE string To multibyte string 
Function StringToMB(S) 
    Dim I, B 
    For I = 1 To Len(S) 
    B = B & ChrB(Asc(Mid(S, I, 1))) 
    Next 
    StringToMB = B 
End Function 
'******************* upload - end 

'******************* Support 
'Basic script info 
Sub InfoEcho() 
    Dim Msg 
    Msg = Msg + "Upload file using http And multipart/form-data" & vbCrLf 
    Msg = Msg + "Copyright (C) 2001 Antonin Foller, PSTRUH Software" & vbCrLf 
    Msg = Msg + "use" & vbCrLf 
    Msg = Msg + "[cscript|wscript] fupload.vbs file url [fieldname]" & vbCrLf 
    Msg = Msg + " file ... Local file To upload" & vbCrLf 
    Msg = Msg + " url ... URL which can accept uploaded data" & vbCrLf 
    Msg = Msg + " fieldname ... Name of the source form field." & vbCrLf 
    Msg = Msg + vbCrLf + CheckRequirements 
    WScript.Echo Msg 
    WScript.Quit 
End Sub 

'Checks If all of required objects are installed 
Function CheckRequirements() 
    Dim Msg 
    Msg = "This script requires some objects installed To run properly." & vbCrLf 
    Msg = Msg & CheckOneObject("ADODB.Recordset") 
    Msg = Msg & CheckOneObject("ADODB.Stream") 
    Msg = Msg & CheckOneObject("InternetExplorer.Application") 
    CheckRequirements = Msg 
' MsgBox Msg 
End Function 

'Checks If the one object is installed. 
Function CheckOneObject(oClass) 
    Dim Msg 
    On Error Resume Next 
    CreateObject oClass 
    If Err = 0 Then Msg = "OK" Else Msg = "Error:" & Err.Description 
    CheckOneObject = oClass & " - " & Msg & vbCrLf 
End Function 

Hier ist das HTML-Segment.

<input name="userfile" id="userfile" type="file">

+0

1. Sie die Navigation zu 'URL', erklärte aber,' DestURL' so sollte der Code sein: 'WebBrowser.Navigate DestURL'. 2. Schau dir die HTML-Quelle an. Das Dateiauswahlfeld unter dieser URL befindet sich in einem iframe, so dass die Eingabe wirklich 'fileUpload' heißt und sich bei free-online-ocr.com/upload.aspx befindet. Andere Steuerelemente auf dieser Seite sind programmatisch erstellt und ausgeblendet (z. B. "__EVENTVALIDATION") und bestehen wahrscheinlich nur, um eine automatisierte Automatisierung ihres kostenlosen Dienstes zu verhindern. Es kann sein, dass Sie anstatt die Datei zu senden, als ob eine Schaltfläche gedrückt wurde, möchten Sie möglicherweise untersuchen, den Dateiauswahlprozess zu automatisieren. – Tim

+0

Ich habe mir das nochmal angeschaut und du hast ein anderes Problem. Der Link (OCR-Site) in Ihrer Beschreibung bezieht sich auf newocr.com, aber der Link in Ihrem Code ist auf free-online-ocr.com. Das macht es unklar, auf welcher Website Sie eigentlich zugreifen möchten, und der Code unterscheidet sich drastisch je nachdem, welche Seite Sie eigentlich automatisieren möchten. Ist dies nur ein Linkbuilding-Schema für Suchmaschinen-Rankings, oder müssen Sie Ihren Beitrag aufräumen? – Tim

+0

seine newocr.com, ich habe das bemerkt und den Code entsprechend neu konfiguriert, bevor ich gepostet habe. Entschuldigung, ich habe hier die falsche OCR-Seite benutzt. – Adhil

Antwort

1

können Sie ScriptUtils.ASPForm verwenden hochgeladenen Dateien in ASP zu akzeptieren. ScriptUtils.ASPForm enthält einen leistungsstarken Algorithmus mit geringem Ressourcenverbrauch, der bis zu 2 GB Daten aufnehmen kann.

  1. Es gibt einige Schritte zum Hochladen von Dateien mit http und multipart/form-data Dokument. Zuerst müssen wir die Datei von einer Diskette lesen. Wir können Scripting.FileSystemObject verwenden, um Textdaten zu lesen, oder ADODB.Stream, um eine Datei zu lesen. Die Funktion GetFile funktioniert mit ADODB.Stream.

  2. Die zweite Aufgabe, die wir ausführen müssen, ist ein Build von multipart/form-data Dokument. Das Dokument enthält mehrere Felder, die durch eine Grenze getrennt sind. Jedes der Felder hat einen eigenen Header, der Informationen über den Feldnamen, den Dateinamen und den Inhaltstyp der Quelldatei enthält. ADO-Recordset-Objekt hat eine großartige Methode AppendChunk, mit der Sie Teile von Multipart/Formulardaten-Dokument (Open Grenze + Header + Datei Inhalt + schließen Grenze) verbinden können. Sie können den Code in der Funktion BuildFormData sehen.

  3. Letzte Aufgabe ist das Senden des Multipart/Form-Datendokuments als Postanforderung an den Server mit multipart/form-data Content-Type-Header. Wir können mindestens zwei Objekte verwenden, um eine POST-Anfrage zu senden - XMLHttp oder InternetExplorer. Dieses Skript verwendet die Navigate-Methode des InternetExplorer.Application-Objekts. Sie können den Code in IEPostBinaryRequest Funktion

sehen Sie bitte in den folgenden Link für weitere Informationen.

http://www.motobit.com/tips/detpg_uploadvbsie/

GetFile Methode konvertiert die Datei in UTF-8. Pdf wird mehr als 128 Byte haben, Sie es Multi-Byte-String

'Converts OLE string To multibyte stringFunction StringToMB(S) 
    Dim I, B 
    For I = 1 To Len(S) 
    B = B & ChrB(Asc(Mid(S, I, 1))) 
    Next 
    StringToMB = B End Function 

Bitte lesen Sie diese Seite

http://www.mrexcel.com/forum/excel-questions/861695-using-xmlhttp-upload-file-api.html#post4192153

+1

Vielen Dank, vielleicht könnten Sie ein wenig weiter in diesem Zusammenhang? – Adhil

+0

Vielen Dank, aber wie können Sie, aber wie können Sie eine Multibyte-Daten an den Webbrowser senden? – Adhil

+0

Der Link, den ich zur Verfügung gestellt habe, enthält Detaillösung. – newjenn

0

Ich verbrachte konvertieren müssen schon mehrere Tage mit der gleichen Technik zu experimentieren - Verwenden der Navigate-Methode der InternetExplorer.Application-COM-Schnittstelle zum Hochladen einer Datei.
Die Dokumentation für Navigate zeigt an, dass das Angeben des postdata-Parameters einen HTTP-POST auslöst, aber nach meiner Erfahrung ist auch der Inhaltstyp ein bestimmender Faktor. Mit Fiddler habe ich festgestellt, dass es GET HTTP-Methode statt POST konsistent gesendet hat, wenn Content-Type = multipart/form-data.

Durch das Senden des GET-Verbs wird der Server angewiesen, alle Formulardaten zu ignorieren und nur den URI zu verarbeiten.

This page zeigt an, dass er ein wenig Erfolg mit dem XMLHTTP-Objekt hatte, das eine feinere Kontrolle über die HTTP-Anfrage ermöglicht. Hier einige Powershell-Code, der diese Technik demonstriert:

$http = (New-Object -ComObject "MSXML2.XMLHTTP") 
$http.Open("POST",$DestURL,$false) 
$http.SetRequestHeader("Content-Type", "multipart/form-data; boundary=" + $boundary) 
$http.Send($PostData) 
Verwandte Themen