65.9K
CodeProject 正在变化。 阅读更多。
Home

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

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.88/5 (7投票s)

2014年10月16日

CPOL

3分钟阅读

viewsIcon

32491

从 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 方法发送到指定服务器的方法。

它基于使用 HttpClientHttpPostFileEntity SDK 类。

它初始化我们的 httpClient 对象和 HttpPost。 之后,它将 FileEntityContentType 设置为 “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 的文件传输。

我的代码示例被故意简化了,因为它取决于您的程序,以及您何时何地决定使用它们。

 

© . All rights reserved.