从 Android 上传大型文件到 ASP.NET






4.88/5 (7投票s)
从 Android 上传大型文件到 ASP.NET
目录
引言
本文将解释如何从 Android 客户端上传大型文件到 ASP.NET 服务器。
我们将要在 Android 和 ASP.NET 上实现几个方法,并查看一些 ASP.NET 服务器配置。
Android 实现
HttpResult 类和 HttpErros 枚举
首先,我们将要实现一个简单的 Java 类,其中包含一个 enum,用于标识 http 请求错误。
这不是必须的,但它可以更容易地处理 UI 上的问题,这些问题在发送 http 请求时会累积。
我们将从我们的方法中获得 HttpResult 作为响应,我们将不仅能够了解消息是否已发送,还能了解什么异常停止了执行。
public enum HttpErrors
{
NO_ERROR,
ConnectTimeoutException,
SocketTimeoutException,
ClientProtocolException,
IOException
}
public class HttpResult
{
public HttpErrors Error;
public String Result;
public HttpResult(String serverMessage, HttpErrors error)
{
Result = serverMessage;
Error = error;
}
public boolean IsError()
{
return !Error.equals(HttpErrors.NO_ERROR);
}
}
SendFile 方法
此方法仅用于形成 URL。 好吧,在此示例中不是,但如果您需要在其中设置一些 GET 参数,这就是放置的位置。
它识别文件是否存在,并根据文件大小,通过将 double 值传递给 PostFile 方法来设置请求的超时时间。
public HttpResult SendFile(File file) { String url = "your_server_url"; if(file.exists()) { double timeout = file.length() / 1024 / 20; result = PostFile(file, url, (int)timeout); } return result; }
PostFile 方法
此方法是将给定的文件通过 URL 使用 POST 方法发送到指定服务器的方法。
它基于使用 HttpClient、HttpPost 和 FileEntity SDK 类。
它初始化我们的 httpClient 对象和 HttpPost。 之后,它将 FileEntity 的 ContentType 设置为 “application/zip”,并将其设置为请求的实体。
在 try-catch 中,我们正在等待服务器响应,并将其作为 String 类型设置到我们的结果中。
如果请求的执行时间超过我们指定的超时时间,则会抛出 SocketTimeoutException 异常。
请记住,任何网络通信都不能在主线程上进行!
public HttpResult PostFile(File file, String url, int timeout)
{
HttpResult result = null;
HttpClient httpclient = new DefaultHttpClient();
HttpPost request = new HttpPost(url);
request.setParams(GetHttpParams(timeout));
FileEntity reqEntity = new FileEntity(file, "application/zip");
request.setEntity(reqEntity);
HttpResponse response;
try
{
response = httpclient.execute(request);
HttpEntity entity = response.getEntity();
if (entity != null)
{
result = new HttpResult(EntityUtils.toString(entity),
HttpErrors.NO_ERROR);
entity.consumeContent();
}
}
catch(SocketTimeoutException timeout)
{
result = new HttpResult(null,HttpErrors.SocketTimeoutException);
}
catch (ClientProtocolException e)
{
result = new HttpResult(null, HttpErrors.ClientProtocolException);
}
catch (IOException e)
{
result = new HttpResult(HttpErrors.IOException);
}
httpclient.getConnectionManager().shutdown();
return result;
}
这就是我们在客户端(Android)端需要的所有内容,这些方法涵盖了将大型文件发送到服务器的所有需求。
ASP 实现
Handlefile 方法
在服务器端,您需要像访问页面一样实现此方法。
此方法将读取客户端请求中的输入流字节,并通过调用 Save() 方法保存文件。
其他数据可以设置为 URL 查询字符串中的参数。 无论如何,这只是一个建议。
private void Handlefile()
{
int length = (int)Request.InputStream.Length;
byte[] buffer = new byte[length];
Request.InputStream.Read(buffer, 0, length);
Save(buffer);
}
Save 方法的示例
void Save(byte[] bytes)
{
System.IO.File.WriteAllBytes(“C:\MyServerData\new_file.bin”, bytes);
}
ASP Web.config 文件
什么是 Web.config?
Web.config 文件是一种 xml 格式的配置文件。 它指定了您的 ASP 应用程序的配置。
这些配置可以在此文件中设置,也可以以编程方式设置。
此文件的一个重要优势是,您可以更改程序设置,而无需触及服务器上已编译的代码。
例如,在调试应用程序时,通常您希望从服务器获取错误。 这可以通过指定来完成
<configuration>
<system.web>
<customErrors mode=”On”/>
</system.web>
</configuration>
代码编译并设置在 IIS 上后,您可以根据需要更改其 mode 值。
设置 Web.config 配置
在我们的例子中,我们需要指定其他参数。
我们将在 system.web 节点下指定 httpRuntime 节点。
</system.web>
<httpRuntime maxRequestLength="102400" executionTimeout="3600" />
</system.web>
在这里,我们指定文件的最大长度(在我们的例子中设置为 100MB)和请求的执行时间(在我们的例子中为 1 小时)。
另一个要求是
<security>
<requestFiltering>
<requestLimits maxAllowedContentLength="104857600" />
</requestFiltering>
</security>
它指定了 Http 请求限制的最大值(在我们的例子中设置为 100MB)。
摘要
我们在本文中实现了客户端和服务器端。 一旦它设置在您的应用程序上,您将不再需要担心从 Android 到 ASP 的文件传输。
我的代码示例被故意简化了,因为它取决于您的程序,以及您何时何地决定使用它们。