在WEB常常有人问我如何直接给file发文件呢??
通常都告诉别人可以使wscript.shell用sendkeys模拟,但是那个是没有用处的,如果仅仅是不喜欢file控件呢,可以用层把file透明了,用button结合text,两种方法具体如下:
这个是方法2: <div style="position:absolute;top:11px;left:-71px;width:150;filter:alpha(opacity=0)" > <input name="file" type="file" size=33 onpropertychange="a.value=this.value"> </div>
方法一是: <script language=javascript> function window.onload() { document.form1.T1.focus(); var WshShell=new ActiveXObject("WScript.Shell"); WshShell.sendKeys("c:\\test.txt"); //向文本框里发送东东 } </script>
这并不是所有的,我以前还写过一个VB的ftp上传,做成控件定时传送的
Public Declare Function InternetOpen Lib "wininet.dll" Alias "InternetOpenA" _ (ByVal sAgent As String, ByVal LAccessType As Long, ByVal sProxyName As String, _ ByVal SProxyBypass As String, ByVal lFlags As Long) As Long
Public Declare Function InternetConnect Lib "wininet.dll" Alias "InternetConnectA" _ (ByVal hInternetSession As Long, ByVal sServerName As String, _ ByVal nServerPort As Integer, ByVal sUsername As String, _ ByVal sPassword As String, ByVal lService As Long, _ ByVal lFlags As Long, ByVal lContext As Long) As Long
Public Declare Function FtpGetFile Lib "wininet.dll" Alias "FtpGetFileA" _ (ByVal hFtpSession As Long, ByVal lpszRemoteFile As String, _ ByVal lpszNewFile As String, ByVal fFailIfExists As Boolean, _ ByVal dwFlagsAndAttributes As Long, ByVal dwFlags As Long, _ ByVal dwContext As Long) As Boolean
Public Declare Function FtpPutFile Lib "wininet.dll" Alias "FtpPutFileA" _ (ByVal hFtpSession As Long, ByVal lpszLocalFile As String, _ ByVal lpszRemoteFile As String, ByVal dwFlags As Long, _ ByVal dwContext As Long) As Boolean
Public Declare Function FtpDeleteFile Lib "wininet.dll" Alias "FtpDeleteFileA" _ (ByVal hFtpSession As Long, ByVal lpszFileName As String) As Boolean Public Declare Function FtpRenameFile Lib "wininet.dll" Alias "FtpRenameFileA" _ (ByVal hFtpSession As Long, ByVal lpszExsiting As String, ByVal lpszNew As String) As Boolean Public Declare Function InternetCloseHandle Lib "wininet.dll" (ByVal hInet As Long) As Integer
Private Sub Timer1_Timer() lnginet = InternetOpen(vbNullString, INTERNET_OPEN_TYPE_PRECONFIG, _ vbNullString, vbNullString, 0&) If lnginet Then lnginetconn = InternetConnect(lnginet, "210.51.180.101", 0, _ "用户名", "密码", 1, 0, 0) If lnginetconn Then blnrc = FtpPutFile(lnginetconn, "你的具体上传的东东", "网站的FTP的文件夹", 0, 0, 1, 0) If blnrc Then MsgBox "download ok!!!" End If InternetCloseHandle lnginetconn InternetCloseHandle lnginet Else a = 1 DoEvents End If Else a = 2 DoEvents End If End Sub 当然这个也不最后的,因为别人毕竟要得是http的上传
研究了一下发现一个好办法是用httpsendrequest函数,可以用http协议直接上传,唯一的问题是客户端要允许你注册 BOOL UseHttpSendReqEx(HINTERNET hRequest, DWORD dwPostSize) { INTERNET_BUFFERS BufferIn; DWORD dwBytesWritten; int n; BYTE pBuffer[1024]; BOOL bRet;
BufferIn.dwStructSize = sizeof( INTERNET_BUFFERS ); // Must be set or error will occur BufferIn.Next = NULL; BufferIn.lpcszHeader = NULL; BufferIn.dwHeadersLength = 0; BufferIn.dwHeadersTotal = 0; BufferIn.lpvBuffer = NULL; BufferIn.dwBufferLength = 0; BufferIn.dwBufferTotal = dwPostSize; // This is the only member used other than dwStructSize BufferIn.dwOffsetLow = 0; BufferIn.dwOffsetHigh = 0;
if(!HttpSendRequestEx( hRequest, &BufferIn, NULL, 0, 0)) { printf( "Error on HttpSendRequestEx %d\n",GetLastError() ); return FALSE; }
FillMemory(pBuffer, 1024, 'D'); // Fill buffer with data
bRet=TRUE; for(n=1; n<=(int)dwPostSize/1024 && bRet; n++) { if(bRet=InternetWriteFile( hRequest, pBuffer, 1024, &dwBytesWritten)) printf( "\r%d bytes sent.", n*1024); } if(!bRet) { printf( "\nError on InternetWriteFile %lu\n",GetLastError() ); return FALSE; }
if(!HttpEndRequest(hRequest, NULL, 0, 0)) { printf( "Error on HttpEndRequest %lu \n", GetLastError()); return FALSE; }
return TRUE; } 这个是用VC写的,道理是相同的,可以在MSDN上查到httpsendrequest的原型,上面那个程序的难点就是把文件分割了,以便于ASP的接收 
|