2017-12-19 125 views
5

Tôi đang cố gắng tự động tải tệp xuống trang web qua Excel VBA nhưng tôi đang cố gắng tương tác đúng cách với phần tải tệp của trang web. Tôi đã đọc nhiều trang web và câu trả lời khác nhau cả ở đây và các nguồn khác về cách thực hiện điều này nhưng cho đến nay nỗ lực của tôi không thành công.Excel VBA Tự động tải tệp IE

Phải thừa nhận rằng tôi không thực sự gắn kết về tương tác với IE qua VBA và các phần tử HTML (hoặc khác) và cần trợ giúp.

Phần của trang web tôi đang đấu tranh để tương tác với là thế này:

<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> 

Các VBA Tôi đã quản lý để mã cho đến nay là như sau (một chút lộn xộn Tôi biết là tôi vẫn đang làm việc trên khác nhau cách để làm cho nó hoạt động) yếu tố web mà tôi đang cố gắng sử dụng nằm trên "URL của tôi 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 

Mọi thứ hoạt động ngoài việc tải tệp. Khi nó chạy, nó chỉ kết thúc lên điều hướng đến một trang web không tìm thấy màn hình và tập tin không tải lên nhưng tôi không nhận được bất kỳ lỗi VBA, vv

Bất kỳ trợ giúp sẽ được đánh giá cao. Tôi không có cách nào khác để tải tệp lên do mạng, ứng dụng và các hạn chế làm việc khác vì vậy tôi cần tương tác với trang/biểu mẫu này.

Sửa: Mã trang đầy đủ như sau ...

<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

Tôi sẽ tưởng tượng rằng trang web được đề cập đến có thể có một số giao diện người dùng để chuẩn bị tệp để tải lên. Có lẽ một số sự kiện Javascript không kích hoạt do thao tác của bạn về các phần tử DOM. Nếu không tìm kiếm chiều sâu, đó sẽ là dự đoán của tôi ... Điều này thường có thể kích hoạt một sự kiện click chuột chẳng hạn? Chỉ cần một cái gì đó để nhìn vào cho đến khi một người nào đó với thời gian để có được điều này có thể đến giúp đỡ (quá bận tôi sợ) –

+0

Trong trang web, khi bạn nhấp vào phần tử nó sẽ tự động mở một cửa sổ trình duyệt tập tin và khi bạn chọn tập tin của bạn nó điền vào một hộp (tuy nhiên bạn không thể bấm vào phía sau và gõ bất cứ điều gì bằng tay). Sau đó, bạn phải nhấn nút gửi và tải tệp và làm mới pafe. Tôi sẽ thêm mã trang đầy đủ để hỗ trợ có lẽ. –

+0

Không phải là chuyên gia về chủ đề này, nhưng liên kết này: https://stackoverflow.com/questions/4007969/application-x-www-form-urlencoded-or-multipart-form-data dường như chỉ ra rằng đối với 'multipart/form-data' form bạn không thể bao gồm ranh giới (vbCrlf) trong dữ liệu biểu mẫu. Tôi thấy bạn bao gồm vbCrlf trong biến 'd', có lẽ đó là vấn đề? Bạn đã bao gồm ranh giới khi bạn không thể? –

Trả lời

0

Một số cải tiến an ninh đã được thêm vào Internet Explorer xung quanh sự kiểm soát tập tin đầu vào.

  1. Giá trị gửi đến máy chủ có khả năng sẽ chứa một "con đường giả" như vậy là không để lộ đến máy chủ chứa file đến từ
  2. Các đầu vào bị vô hiệu hóa từ những người dùng có thể nhập vào một giá trị (này đã được snooped trên bởi keyloggers trên các trang)
  3. trường (hoặc nút) cần phải được bấm bằng so với người dùng kích hoạt một sự kiện click vào nó với JavaScript

như vậy, tôi mong chờ đầy đủ cả # 2 và # 3 là trình chặn từ bất kỳ công cụ tự động nào tương tác với trường ... trừ khi công cụ đó hoàn toàn có thể bắt chước người dùng từ thế giới Windows, thực sự nhấp vào nút trong trình duyệt, sau đó cũng chọn tệp từ hộp thoại chọn tệp.

Các vấn đề liên quan