File控件上传的几种黑科技

之前在Csdn WEB大版常常有人问我如何直接给input File控件发文件


第一种技术方案:

在笔者回答这个的问题的时候 ie还有漏洞,所以当时通常的方法是使用Wscript.Shell 通过SendKeys给File控件赋值

代码如下

<script  language=javascript>  
function  window.onload()  
{  
       document.form1.T1.focus();  
       var  WshShell = new  ActiveXObject("WScript.Shell");  
       WshShell.sendKeys("c://test.txt");  //此处代码即为向文本框里直接写入文件路径  
}  
</script> 

此方法在03年的时候,就被微软在浏览器端封杀了,不过如果还有玩hta的朋友还可以试试此类黑科技。


第二种技术方案:

除了上述方式还有一些网友其实的问题实质是不显示File控件,但点击后依然需要能选择文件。

其实这类方法就比较简单了,现在插件把包容file控件的容器透明化,悬浮在给用户看到的上传按钮上,这样不需要显示出上传控件也可以实现上传功能

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


 
第三种技术方案:


采用组件技术,做成IE浏览器插件,通过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

第四种方式

跟第三种类似依然采用了组件模式,使用api 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;
}
以上是我于2004年写的口水文,不过也是青春的纪念,永远怀念那时对技术的追求 - 2016年整理,虽然代码真的很挫

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
新颖网络上传插件(StorageWebPlug)是一个支持超大文件(2GB,可扩展)上传的COM控件, 具备断点续传,文件MD5验证,大大提高上传效率、节省带宽,有详细的上传进度显示,支持多种脚本语言,欢迎下载体验。免费提供JavaScript SDK包。 产品特点: 1、文件上传使用增强的FTP协议,用户使用浏览器就可以上传超大文件到服务器(支持上传超过1G的文件)。 2、支持断点续传,系统智能续传未上传的文件,续传操作更简单,更方便,更快捷。 3、支持文件批量上传, 一次可以上传多个文件. 上传时有详细的状态显示(包括单个文件进度,整体进度,传输速率,剩余时间等)。 4、新颖网络免费提供JavaScript SDK包。通过新颖网络提供的封装好的JavaScript类库用户可以快速的与现有系统整合。 5、StorageWebPlug提供完善的接口和帮助文档,开发文档。开发人员可以动态设置上传保存路径, 设置允许扩展名, 允许最大大小等,可自定义强。 6、支持各种代理(HTTP, Socket4, Socket5等)。 7、组件采用多线程机制来保证上传效率。 8、支持批量文件上传, 用户可以一次性上传批量文件. 客户端可以绑定HTML表单变量, 服务端并可以接收表单变量 9、服务端文件保存路径可以随意指定,服务端文件保存路径可以灵活变化。保存路径支持网络路径。 10、为提高安全性,服务端组件可以指定用户权限 11、可以限制上传单个文件大小, 控制上传带宽上限, 允许文件扩展名, 拒绝文件扩展名等 12、上传数据时会根据网络状况来控制数据包大小, 避免网络堵塞 13、控件采用ATL编写, cab包只有59KB, 用56k的modem下载不会超过12秒 14、服务端支持Windows 2000 Server/Windows 2003 Server/Windows NT/Windows XP/Unix/Linux等操作系统 15、通过新颖网络业界领先的设计水平打造的操作界面可以帮助您的系统和产品获得更高的品质。 产品介绍:http://www.ncmem.com/service_storagewebplug.aspx 下载地址:http://www.ncmem.com/download.aspx

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值