2016-02-15 3 views
1

Я пытаюсь загрузить изображение на сайт интрасети моей компании. Но он открывает FileDialog, и мне нужно выбрать файл, а затем нажать кнопку «ОК». Но я не хочу этого делать с помощью sendKeys. Кто-нибудь знает, как управлять этим Microsoft Windows FileDialog, с VBA. Просто поле «имя файла» и кнопка «ОК».Как управлять открытым файлом с помощью VBA?

Извините, если у меня нет кода. Это потому, что я не мог найти никого. Не имеют ни малейшего представления о.

ответ

1

Наиболее эффективным способом является загрузка файлов через XHR. В своем браузере откройте «Инструменты разработчика», вкладку «Сеть», откройте веб-страницу сайта интрасети, сделайте загрузку файла как обычно. Затем, основываясь на параметрах из последнего зарегистрированного запроса POST, вы можете создать тот же XHR.

В качестве примера, вот код, который реализует функциональность простейшего веб-форму, содержащую только поле типа файла:

Sub UploadTest() 

    Dim strUplStatus, strUplResponse 

    UploadFile "C:\image.jpg", strUplStatus, strUplResponse 
    MsgBox strUplStatus & vbCrLf & strUplResponse 

End Sub 

Sub UploadFile(strPath, strStatus, strResponse) 

    Dim strFile, strExt, strContentType, strBoundary, bytData, bytPayLoad 

    On Error Resume Next 
    With CreateObject("Scripting.FileSystemObject") 
     If .FileExists(strPath) Then 
      strFile = .GetFileName(strPath) 
      strExt = .GetExtensionName(strPath) 
     Else 
      strStatus = "File not found" 
      Exit Sub 
     End If 
    End With 
    With CreateObject("Scripting.Dictionary") 
     .Add "txt", "text/plain" 
     .Add "html", "text/html" 
     .Add "php", "application/x-php" 
     .Add "js", "application/x-javascript" 
     .Add "vbs", "application/x-vbs" 
     .Add "bat", "application/x-bat" 
     .Add "jpeg", "image/jpeg" 
     .Add "jpg", "image/jpeg" 
     .Add "png", "image/png" 
     .Add "exe", "application/exe" 
     .Add "doc", "application/msword" 
     .Add "docx", "application/vnd.openxmlformats-officedocument.wordprocessingml.document" 
     .Add "xls", "application/vnd.ms-excel" 
     .Add "xlsx", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" 
     strContentType = .Item(LCase(strExt)) 
    End With 
    If strContentType = "" Then 
     strStatus = "Invalid file type" 
     Exit Sub 
    End If 
    With CreateObject("ADODB.Stream") 
     .Type = 1 
     .Mode = 3 
     .Open 
     .LoadFromFile strPath 
     If Err.Number <> 0 Then 
      strStatus = Err.Description & " (" & Err.Number & ")" 
      Exit Sub 
     End If 
     bytData = .Read 
    End With 
    strBoundary = String(6, "-") & Replace(Mid(CreateObject("Scriptlet.TypeLib").GUID, 2, 36), "-", "") 
    With CreateObject("ADODB.Stream") 
     .Mode = 3 
     .Charset = "Windows-1252" ' Latin 
     .Open 
     .Type = 2 
     .WriteText "--" & strBoundary & vbCrLf 
     .WriteText "Content-Disposition: form-data; name=""upload_file""; filename=""" & strFile & """" & vbCrLf 
     .WriteText "Content-Type: """ & strContentType & """" & vbCrLf & vbCrLf 
     .Position = 0 
     .Type = 1 
     .Position = .Size 
     .Write bytData 
     .Position = 0 
     .Type = 2 
     .Position = .Size 
     .WriteText vbCrLf & "--" & strBoundary & "--" 
     .Position = 0 
     .Type = 1 
     bytPayLoad = .Read 
    End With 
    With CreateObject("MSXML2.XMLHTTP") 
     .Open "POST", "http://mysite/upload.php", False 
     .SetRequestHeader "Content-type", "multipart/form-data; boundary=" & strBoundary 
     .Send bytPayLoad 
     If Err.Number <> 0 Then 
      strStatus = Err.Description & " (" & Err.Number & ")" 
     Else 
      strStatus = .StatusText & " (" & .Status & ")" 
     End If 
     If .Status = "200" Then strResponse = .ResponseText 
    End With 

End Sub 
Смежные вопросы