Потоковый файл с Android на .net http сервис - PullRequest
1 голос
/ 09 сентября 2011

Я пытаюсь передать файл с Android на службу asp.net:

private static void writeFile(File file, DataOutputStream out)
        throws IOException {

    BufferedInputStream bufferedFileIs = null;
    Base64OutputStream base64out = null;
    try {
        out.writeBytes("fileBase64=");
        base64out = new Base64OutputStream(out, Base64.DEFAULT);

        FileInputStream fileIs = new FileInputStream(file);
        bufferedFileIs = new BufferedInputStream(fileIs);
        int nextByte;
        while ((nextByte = bufferedFileIs.read()) != -1) {
            base64out.write(nextByte);
        }
    } finally {
        if (bufferedFileIs != null) {   
            bufferedFileIs.close();
        }
        if(base64out != null)
            base64out.flush();

    }

}

и получить его вот так

String base64 = Request.Form["fileBase64"];

byte[] bytes = System.Convert.FromBase64String(base64);

Я использую HttpURLConnection и не получаю никакихисключения, но полученный файл (изображение) поврежден в процессе.Я попробовал ОЧЕНЬ много разных пар обертки потока, но не повезло.У кого-нибудь есть опыт в этом?Я передаю другие записи формы в том же соединении, и они поступают не поврежденными, например,

&UserID=12345

Gratefull за вашу помощь.

Приветствия!

1 Ответ

3 голосов
/ 12 сентября 2011

Решено:

Подготовить файл:

File file = new File(LocalFilePath);

FileEntity fileentity = new FileEntity(file, "UTF-8");
HttpUtilities.postRequest(WebServiceURL, fileentity);

отправить запрос:

public static String postRequest(String url, HttpEntity aEntity)
        throws IOException {

    InputStream is = null;
    try {

        HttpClient client = new DefaultHttpClient();

        HttpPost httppost = new HttpPost(url);

        httppost.setEntity(aEntity);

        HttpResponse response = client.execute(httppost);
        HttpEntity responseEntity = response.getEntity();

        is = responseEntity.getContent();

    } catch (Exception e) {
    }

    return getResponse(is);
}

после этого веб-сервер пожаловался:

HttpException (0x80004005): Maximum request length exceeded

максимальная длина запроса по умолчанию равна 4 МБ, поэтому я установил это в web.config:

<system.web>
    <httpRuntime maxRequestLength="1048576"/>
</system.web

, который разрешает файлы размером до 1 ГБ (!).

изменить:

Забыли код сервера:

var str = Request.InputStream;
strLen = Convert.ToInt32(str.Length);
byte[] strArr = new byte[strLen];
strRead = str.Read(strArr, 0, strLen);
...