2017-12-19 2 views
5

Excel VBA를 통해 웹 사이트로 파일로드를 자동화하려고하지만 웹 페이지의 파일로드 부분과 제대로 상호 작용하는 데 어려움을 겪고 있습니다. 나는 여러 가지 다른 웹 페이지를 읽었으며 여기에서 그리고 다른 방법으로이 방법에 대한 답변을했지만 내 시도는 실패하고 있습니다.Excel VBA 자동 IE 파일로드

틀림없이 나는 VBA와 다양한 HTML (또는 기타) 요소를 통해 IE와 상호 작용하고 도움이 필요하다고 인정합니다.

내가와 상호 작용하는 데 어려움을 겪고하고있는 웹 페이지의 부분은 이것이다 :

<LABEL ACCESSKEY=U CLASS=filelabel>Upload a file to current older: 
<INPUT TYPE="file" NAME="eftupload" CLASS=filefield/></LABEL> 
<INPUT TYPE="submit" value="Upload" CLASS=submitbutton> 

다음과 같이 내가 코드를 관리하신 VBA 지금까지입니다 (난 여전히 다양한 일하고 나는 알고 지저분한 조금 방법은 내가 사용하려고 웹 요소가 "내 URL 2"에 위치)는 작업을 진행합니다 :

Sub File2Web() 

'dimension (declare or set aside memory for) our variables 
Dim objIE As InternetExplorer 'special object variable representing the IE browser 
Dim aEle As HTMLLinkElement 'special object variable for an <a> (link) element 

'initiating a new instance of Internet Explorer and asigning it to objIE 
Set objIE = New InternetExplorer 

'make IE browser visible (False would allow IE to run in the background) 
objIE.Visible = True 

'navigate IE to this web page (a pretty neat search engine really) 
objIE.Navigate "my URL" 

'wait here a few seconds while the browser is busy 
Do While objIE.Busy = True Or objIE.ReadyState <> 4: DoEvents: Loop 

'in the userid box put value 
objIE.Document.getElementById("username").Value = "userID" 

'in the password box put value 
objIE.Document.getElementById("password").Value = "PassWD" 

'click the 'go' button 
objIE.Document.getElementById("loginSubmit").Click 
'wait again for the browser 
Do While objIE.Busy = True Or objIE.ReadyState <> 4: DoEvents: Loop 

'navigate IE to this web page 
'Upload file using input type=file 
Dim sFormData As String, d As String 
Dim FileName As String, FieldName As String 
FieldName = "File" 
FileName = "C:\FTP Temp\Test.txt" 

'Boundary of fields. Be sure this string is Not In the source file 
Const Boundary As String = "" 

'Get source file As a string. 
sFormData = GetFile(FileName) 

FieldName = "frmUpload" 

'Build source form with file contents 
d = d + "Content-Disposition: form-data; name=""" + FieldName + """;" 
d = d + " filename=""" + FileName + """" + vbCrLf 
d = d + "Content-Type: application/upload" + vbCrLf + vbCrLf 
d = d + sFormData 
d = d + vbCrLf 


Dim URL As String, FormData As String 
FormData = d 
Dim bFormData() As Byte 
ReDim bFormData(Len(FormData) - 1) 
bFormData = StrConv(FormData, vbFromUnicode) 

URL = "my URL 2" 

objIE.Navigate URL, , , bFormData, "Content-Type: multipart/form-data; boundary=" + vbCrLf 

'wait here a few seconds while the browser is busy 
Do While objIE.Busy = True Or objIE.ReadyState <> 4: DoEvents: Loop 

End Sub 

'read binary file As a string value 
Function GetFile(FileName As String) As String 

Dim FileContents() As Byte, FileNumber As Integer 
ReDim FileContents(FileLen(FileName) - 1) 
FileNumber = FreeFile 
Open FileName For Binary As FileNumber 
Get FileNumber, , FileContents 
Close FileNumber 
GetFile = StrConv(FileContents, vbUnicode) 

End Function 

모든 파일로드에서 떨어져 작동합니다. 그것이 실행되면, 그것은 단지 화면을 찾을 수없는 웹 페이지로 이동 끝나고 파일이 업로드되지 않지만 VBA 오류 등을 전혀 얻지 못합니다.

어떤 도움을 주시면 감사하겠습니다. 네트워크, 응용 프로그램 및 기타 작업 제한으로 인해 파일을 업로드 할 수있는 다른 방법이 없으므로이 페이지/양식과 상호 작용해야합니다.

편집 : 전체 페이지 코드는 다음과 같다 ...

<html> 
<head><title>sftp.mysite.com</title> 
<link href="/EFTClient/efthtmladvanced.css" rel="stylesheet" type="text/css" /> 
<script type="text/javascript" src="/EFTClient/efthtmladvanced.js"> 
</script> 
<script type="text/javascript" src="/EFTClient/Shared/PTCs.js"> 
</script> 
</head> 
<body onload="javascript:init();"><div class=header><H1 CLASS=cwd>sftp.mysite.com - /Input/Applications/UKC Apps/</H1></div>  
<h3><i>NOTE: Web Transfer Client Access has been disabled for this user or container. Reverting to basic client.</i></h3> 
<hr /> 
<FORM NAME="frmUpload" METHOD="POST" ACTION="/Input/Applications/UKC Apps/" ENCTYPE="multipart/form-data"><table border=0 width='90%'> 
<tr> 
    <td width='70%'> 
     <LABEL ACCESSKEY=U CLASS=filelabel>Upload a file to current folder:&nbsp;<INPUT TYPE="file" NAME="eftupload" CLASS=filefield/></LABEL> 
     <INPUT TYPE="submit" value="Upload" CLASS=submitbutton> 
    </td> 
    <td width='30%' align='right'> 
     <INPUT TYPE='button' value='Change Password' onclick="setChangePassDivPosition();showDiv('ChangePass', true);">&nbsp; 
     <INPUT style="visibility:visible;valign='top';" TYPE='button' value='Log Out' onclick='doLogout(); window.location.reload(true); return false;'> 
    </td> 
</tr> 
</table> 
</FORM><hr /> 

<pre> 
<a href="/Input/Applications/;html">[To Parent Directory]</a><br><br> 
<input type="button" value="Delete" name="btnDelete" id="btnDelete" onClick="javascript:deleteFiles();"><BR> 
<input type='checkbox' name='folderitem' value="/Input/Applications/UKC Apps/my file.txt" id='1'>  <a href='javascript:void(0);' onclick="rename('/Input/Applications/UKC Apps/my file.txt');">Rename</a>    18 Dec 2017 14:02  56955145 <a href="/Input/Applications/UKC Apps/myfile.txt;html">my file.txt</a><BR> 
</pre><hr> 
<form name="changePassForm" id="changePassForm" method="post"><div id="ChangePass" class="floatingDiv" style="{ visibility:hidden; }"><table cellpadding="5" cellspacing="0" width="100%" style="border:1px solid black; border-bottom:0px"><tr class="divHeader"><td><table cellpadding=0 cellspacing=0 width="100%%"><tr><td class="formCopy"><b>Change Password</b></td><td class="formCopy" align="right"><a title="Click here to close this dialog" href="javascript:void(0)" onclick="showDiv('ChangePass', false);" style="font-family:verdana; font-size:10px; color:black; text-decoration:none">X</a></td></tr></table></td></tr></table><table cellpadding="5" cellspacing="0" width="100%%" style="border:1px solid black;"><tr><td class="formCopy">Current Password:</td><td class="formCopy"><input type="password" value="" name="oldpass" id="oldpass"></td></tr><tr><td class="formCopy">New Password:</td><td class="formCopy"><input type="password" value="" name="newpass" id="newpass"></td></tr><tr><td class="formCopy">Confirm Password:</td><td class="formCopy"><input type="password" value="" name="confirmpass" id="confirmpass"></td></tr><tr><td class="formCopy">&nbsp;</td><td class="formCopy">&nbsp;</td></tr></table><table cellpadding="5" cellspacing="0" style="border:1px solid black; border-top:2px solid #aaaaaa;" class="divHeader" width="100%%"><tr><td colspan="2" align="right"><input type="button" value="Change Password" onclick="changePassword(this.form);">&nbsp;<input type="button" value="Cancel" onclick="showDiv('ChangePass', false);"></td></tr></table></div></form><br /><br /> 
<center><font face="arial" size="1" color=#3366CC><em>Powered by the <b>Globalscape EFT Server</b></em></font></center> 
<br /> 
</body> 
</html> 
+0

나는 그 웹 페이지에 업로드를 위해 파일을 준비 할 프론트 엔드가있을 것이라고 생각합니다. 아마도 DOM 요소 조작으로 인해 실행되지 않는 자바 스크립트 이벤트 일 수 있습니다. 내 추측이 될 정도로 심오하지 않고 ... 일반적으로 예를 들어 마우스 클릭 이벤트로 인해 발생합니까? 이걸 가지고 갈 누군가가 도와 줄 수있을 때까지 조사해 봐야합니다. (너무 바빠서 두려워요.) –

+0

웹 페이지에서 요소를 클릭하면 자동으로 파일 브라우저 창이 열리고 파일을 선택하면 상자를 채 웁니다 (그러나 뒤로 클릭하고 수동으로 아무 것도 입력 할 수 없음). 그런 다음 제출 버튼을 눌러야하고 파일이로드되고 pafe가 새로 고침됩니다. 아마 전체 페이지 코드를 추가하여 도움을 줄 것입니다. –

+0

이 주제에 대한 전문가는 아니지만이 링크는 https://stackoverflow.com/questions/4007969/application-x-www-form-urlencoded-or-multipart-form-data에서 'multipart/폼 데이터 '폼은 폼 데이터에 경계 (vbCrlf)를 포함 할 수 없습니다. 나는 당신이 변수'd'에 vbCrlf를 포함시킨 것을 보았습니다. 아마도 그게 문제입니까? 할 수 없을 때 경계를 포함 시켰습니까? –

답변

0

몇 가지 향상된 보안 기능은 파일 입력 컨트롤 주위에 인터넷 익스플로러에 추가되었습니다.

  1. (파일이 입력 값을 입력 할 수있는 사용자로부터 비활성화되어
  2. 에서 온 서버에 노출되지 않도록 가능성이 "가짜 경로"를 포함 할 서버로 전송 값 이것은 내가 완전히 모두 기대,
  3. 필드 (또는 버튼) 자바 스크립트 등으로

과의 클릭 이벤트를 트리거 사용자 대에 의해 클릭해야 페이지에 키로거)에 의해 스누핑되고 있었다 # 2와 # 3은 필드와 상호 작용하는 자동화 된 도구의 차단제가됩니다. 실제로 브라우저에서 버튼을 클릭 한 다음 파일 선택기 대화 상자에서 파일을 선택하여 Windows 환경에서 사용자를 모방 할 수 있습니다.