asp大文件上传
1. 怎么修改asp文件上传大小限制
你好方法如下:
asp上传大小限制iis中默认为200K,下面是修改asp上传大小限制详细步骤
1、以记事本方式打开c:\windows\system32\inetsrv\metabase.xml 2、把其中AspMaxRequestEntityAllowed="20480000"
即添加两个0(把ASP上传文件大小限制从200K改为20M)。编辑好保存完最好重启下iis服务! 3、重启iis方法:开始--运行--输入cmd回车--输入iisreset岂可重启iis 或者你也可以进开始--管理工具--服务--最下面有个World Wide Web Publishing Service的服务重启即可 注意:如果metabase.xml修改后想保存但是提示无法编辑,不能保存!这是由于你没有在iis中启用“允许直接编辑配置数据库”的功能。
希望能帮到你。
2. asp.net用多线程上传大文件(500MB~2G)
众所周知,如果需要向WEB服务器上传文件,一般选用下列2种方式。
1. 使用HTTP PUT指令
2. 模拟页面的form提交
第一种需要配置服务器,略过。
第二种需要使用WinInet根据HTTP协议,拼除POST BODY后提交。
对于第二种,在ASP.Net里面特麻烦。
1. 需要模拟页面的VIEWSTATE,模拟不成功就不行
2. ASP.Net对每个请求有最大长度限制,这个值默认为4MB,但可以在web.config中修改
3. 文件在上传过程中并没有直接写入磁盘,而是先放入了内存,等到全部上传结束再写入磁盘。所以如果传输超大的文件对服务器性能影响很大
本文的做法是:
客户端不需要模拟form,将大文件分成等大的小块(如64K),使用多线程将这些小块上传到服务器后,服务器再拼合起来。
---------------------------------------------------------
流程:
1. 客户端:需要向服务器上传一个文件,首先调用服务器的某一个页面(如BeginUpload.aspx),通知此文件的大小(bytes)
2.服务器:服务器收到此请求,首先验证客户端权限,然后在自定义的文件夹中按照请求中提供的大小创建一个空文件,并返回一个唯一标示码到客户端。
3.客户端:收到服务器返回成功后,记录下此次上传的唯一标识码。
4.客户端:将需要上传的这个文件分成大小相等的文件块(如64K)。(这个过程只是一个逻辑上的过程,实际的做法并不需要分块,可以直接使用内存映射文件或者将文件直接读入到虚拟内存以加快速度)
5.客户端:开启一个领导者-跟随者线程池。领导者线程负责要上传文件块的调度,而跟随者线程负责自己分配到的文件块上传。
6.客户端,跟随者线程:读取自己分配到的文件块,向服务器的特定路径或者页面POST文件内容。
这个POST的HEADER或者QueryString里面起码要包含这几个参数:唯一标识码、当前文件块的区间。
7.服务端:收到跟随者线程的请求,以共享方式打开临时文件夹中的文件,写入当前文件块。
8.客户端,领导者线程:检测到文件块全部上传完毕,则向服务器某一个页面报告(如EndUpload.aspx),此文件上传结束,清理资源。
9.服务器:收到文件上传结束的通知,将文件从临时文件夹移动到需要的位置。
10. 服务器周期性地清理临时文件夹中的过期文件。
----------------------------------------------------------------
上面的流程是多线程分块并行上传的基本流程。也可以在此基础上进一步加入CRC32验证文件完整性的功能。如果要简化流程,不需要分块上传,只需要直接进行第6步操作就可以了。
对于第6部,在服务端,可以使用一个*.aspx页面或者一个IHttpHandler来处理请求。
参考下列代码,参数以及其它部分都已经略掉。
protected void Page_Load(object sender, EventArgs e)
{
Stream stream = Page.Request.InputStream;
byte[] buffer = new byte[stream.Length];
stream.Read(buffer, 0, buffer.Length);
// TO DO: Something else
}
protected void Page_Load(object sender, EventArgs e)
{
Stream stream = Page.Request.InputStream;
byte[] buffer = new byte[stream.Length];
stream.Read(buffer, 0, buffer.Length);
// TO DO: Something else
}
对于其它B/S平台,也是类似的方式。
客户端代码,我自己封装了一下,这里只列出关键代码。
view plain to clipboardprint?
void CHttpClient::OpenConnection( LPCTSTR lpszServer, UINT nPort)
{
CloseConnection();
m_hSession = ::InternetOpen( USER_AGENT
, INTERNET_OPEN_TYPE_PRECONFIG
, NULL
, NULL
, 0
);
if( !m_hSession )
throw CCustomException(_T("Error: Failed to connect to the server, InternetOpen failed."));
m_hConnect = ::InternetConnect( m_hSession
, lpszServer
, nPort
, NULL
, NULL
, INTERNET_SERVICE_HTTP
, NULL
, NULL
);
if( !m_hConnect )
throw CCustomException(_T("Error: Failed to connect to the server, InternetConnect failed."));
}
void CHttpClient::CloseConnection(void)
{
if( m_hSession )
{
::InternetCloseHandle(m_hSession);
m_hSession = NULL;
}
if( m_hConnect )
{
::InternetCloseHandle(m_hConnect);
m_hConnect = NULL;
}
}
void CHttpClient::PostBuffer( LPCTSTR lpszPath, LPBYTE lpBuffer, DWORD dwSize)
{
ASSERT( m_hSession && m_hConnect );
HINTERNET hRequest = ::HttpOpenRequest( m_hConnect
, _T("POST")
, lpszPath
, NULL
, NULL
, NULL
, INTERNET_FLAG_NO_CACHE_WRITE
, 0
);
if(!hRequest)
throw CCustomException(_T("Error: Failed to POST data to server, HttpOpenRequest failed."));
INTERNET_BUFFERS stBuffers = {0};
stBuffers.dwStructSize = sizeof(stBuffers);
stBuffers.Next = NULL;
stBuffers.lpcszHeader = NULL;
stBuffers.dwHeadersLength = 0;
stBuffers.dwHeadersTotal = 0;
stBuffers.lpvBuffer = NULL;
stBuffers.dwBufferLength = 0;
stBuffers.dwBufferTotal = dwSize;
stBuffers.dwOffsetLow = 0;
stBuffers.dwOffsetHigh = 0;
BOOL bRet = ::HttpSendRequestEx( hRequest, &stBuffers, NULL, 0, 0);
if(!bRet)
{
::InternetCloseHandle(hRequest);
throw CCustomException(_T("Error: Failed to POST data to server, HttpSendRequestEx failed."));
}
DWORD dwSent = 0;
DWORD dwBytesWritten = 0;
while(dwSent < dwSize)
{
bRet = ::InternetWriteFile( hRequest
, (LPBYTE)(lpBuffer + dwSent)
, dwSize - dwSent
, &dwBytesWritten
);
if( bRet )
dwSent += dwBytesWritten;
}
bRet = ::HttpEndRequest(hRequest, NULL, 0, 0);
::InternetCloseHandle(hRequest);
if( !bRet )
throw CCustomException(_T("Error: Failed to POST data to server, HttpEndRequest failed."));
}
void CHttpClient::OpenConnection( LPCTSTR lpszServer, UINT nPort)
{
CloseConnection();
m_hSession = ::InternetOpen( USER_AGENT
, INTERNET_OPEN_TYPE_PRECONFIG
, NULL
, NULL
, 0
);
if( !m_hSession )
throw CCustomException(_T("Error: Failed to connect to the server, InternetOpen failed."));
m_hConnect = ::InternetConnect( m_hSession
, lpszServer
, nPort
, NULL
, NULL
, INTERNET_SERVICE_HTTP
, NULL
, NULL
);
if( !m_hConnect )
throw CCustomException(_T("Error: Failed to connect to the server, InternetConnect failed."));
}
void CHttpClient::CloseConnection(void)
{
if( m_hSession )
{
::InternetCloseHandle(m_hSession);
m_hSession = NULL;
}
if( m_hConnect )
{
::InternetCloseHandle(m_hConnect);
m_hConnect = NULL;
}
}
void CHttpClient::PostBuffer( LPCTSTR lpszPath, LPBYTE lpBuffer, DWORD dwSize)
{
ASSERT( m_hSession && m_hConnect );
HINTERNET hRequest = ::HttpOpenRequest( m_hConnect
, _T("POST")
, lpszPath
, NULL
, NULL
, NULL
, INTERNET_FLAG_NO_CACHE_WRITE
, 0
);
if(!hRequest)
throw CCustomException(_T("Error: Failed to POST data to server, HttpOpenRequest failed."));
INTERNET_BUFFERS stBuffers = {0};
stBuffers.dwStructSize = sizeof(stBuffers);
stBuffers.Next = NULL;
stBuffers.lpcszHeader = NULL;
stBuffers.dwHeadersLength = 0;
stBuffers.dwHeadersTotal = 0;
stBuffers.lpvBuffer = NULL;
stBuffers.dwBufferLength = 0;
stBuffers.dwBufferTotal = dwSize;
stBuffers.dwOffsetLow = 0;
stBuffers.dwOffsetHigh = 0;
BOOL bRet = ::HttpSendRequestEx( hRequest, &stBuffers, NULL, 0, 0);
if(!bRet)
{
::InternetCloseHandle(hRequest);
throw CCustomException(_T("Error: Failed to POST data to server, HttpSendRequestEx failed."));
}
DWORD dwSent = 0;
DWORD dwBytesWritten = 0;
while(dwSent < dwSize)
{
bRet = ::InternetWriteFile( hRequest
, (LPBYTE)(lpBuffer + dwSent)
, dwSize - dwSent
, &dwBytesWritten
);
if( bRet )
dwSent += dwBytesWritten;
}
bRet = ::HttpEndRequest(hRequest, NULL, 0, 0);
::InternetCloseHandle(hRequest);
if( !bRet )
throw CCustomException(_T("Error: Failed to POST data to server, HttpEndRequest failed."));
}
调用示例:
const int BUFFER_SIZE = 1024000;
CHttpClient oClient;
oClient.OpenConnection( _T("127.0.0.1"), 4638 );
BYTE * pBuffer = new BYTE[BUFFER_SIZE];
for (UINT i = 0; i < BUFFER_SIZE; i++)
{
pBuffer[i] = i%0xFF;
}
oClient.PostBuffer( _T("/1/Default.aspx"), pBuffer, BUFFER_SIZE);
delete [] pBuffer;
说实话,是复制的,我也是个.NET程序员,我看了一下这个代码可以实现你的要求的哈!
3. asp上传大文件问题
IIS6默认上传的大小是多少来着?好像是2M,这是一个原因。
另外你的这个错误应该是404吧,找不到这个文件
无法显示那就是404错误啊,还有个原因就是网络断线了,但这里显然不是这个原因。
4. ASP大文件上传问题
原因有很多:
1 化境上传貌似本来就不推荐传大文件。
2 与你计算机的硬件速度有关,我刚用ASPUPLOAD做了一个上传,服务器配置是P4 1.5, 512MB内存,传500MB以上的文件就会无响应了,后来换到一台P4 3.4,512内存的机器上就好了。
所以还是建议你换到一台好点的机器上试一下先。
或者用组件上传吧,无组件上传一般不适合上传大文件的。
5. ASP.NET中上传超大文件怎么做
<!--
通过 <httpRuntime> 节可以配置 ASP.NET 使用的
上传文件的上传时间,从而实现超大文件上传。
-->
<httpRuntime executionTimeout="36000" maxRequestLength="951200" useFullyQualifiedRedirectUrl="true" minFreeThreads="8" minLocalRequestFreeThreads="4" appRequestQueueLimit="100" enableVersionHeader="true" />
在Web.config的system.web这里加上面这句;
我这是参考别人的,我也没做过超大文件上传,最多上传个几兆图片什么的
6. 如何解决ASP上传大文件
ASP上传大文件的效率并不是很好,不建议使用。可以找一些上传的插件来用,Flash的有相关的源码,同时你也可以搜索 “ASP带进度条的无组件上传”网上有很多相关的示例可参考。
希望对你有帮助 。
7. asp怎样解决大文件上传
ASP上传大文件的效率并不是很好,不建议使用。可以找一些上传的插件来用,Flash的有相关的源码,同时你也可以搜索 “ASP带进度条的无组件上传”网上有很多相关的示例可参考。 希望对你有帮助 。
8. asp如何实现文件上传功能
基本原理是:采用ADO Stream对象的BinaryRead方法将FORM中的所有数据读出,从中截取出所需的文件数据,以二进制文件方式存盘。
下面是上传文件页面的一个例子:
<html>
<body>
<form name="Upload" Method="Post" Enctype="multipart/form-data" Action="Upload.asp">
<input type="file" name="FileName">
<INPUT TYPE="Submit" VALUE="Upload"></TD>
</form>
</body>
</html>
(8)asp大文件上传扩展阅读
几种文件上传技术的比较
1、基于HTTP协议
该方法需要编程者利用第三方软件,如DELPHI、VB等,在应用程序中先进行HTTP协议编程,然后将待上传文件内容按HTTP协议的格式打包,最后向WEB服务器发送上传的请求报文,从而实现文件的上传。
因为DELPHI和VB不能编写完整的WEB网络程序,只能编写WEB小应用程序,因此,该方法只用于功能受限的网络应用。
2、基于VB(或DELPHI等)开发的文件上传组件
该方法利用VB(或DELPHI等编程语言)开发ASP服务器组件,实现特定的文件上传服务。它首先利用ASP表单功能将文件(二进制格式)从用户端上传到服务器端,然后使用VB开发的组件,对二进制文件进行处理,成为可以正常读写的文件。
该方法要求编程者不仅掌握ASP语言,而且还能利用VB等第三方语言进行组件编程,增加了开发的难度。
3、基于数据库技术
该方法和上个方法有类似之处。不同的地方在于对上传的二进制文件的处理上。它使用数据库来保存二进制文件。无论是小型数据库还是大型数据库都提供了存储二进制数据的数据类型,只要以Append Chunk方式将数据存入相应的字段就可以了。
该方法虽然简单可行,但是因为每次上传的文件大小都是不一样的,因此,会对数据库的空间造成很大的浪费,降低了数据的访问速度;并且使得文件只能在数据库环境下进行访问,造成了很大的不便。