1

我在将位图流写入 WCF DataOutputStream 请求时遇到了一个奇怪的问题。我正进入(状态:

IOException: 预期字节 XXX 但收到 XXX

我已经使用 FileInputStream 对其进行了测试,并且可以完美上传,但是当我将位图转换为 InputStream 时,它会抛出一个IOException. 任何帮助将不胜感激。

下面是我调用 AsyncTask 的函数:

public static Boolean AddAdItemImage(int AdItemId,File ThisFile)
{
    HttpURLConnection conn = null;
    DataOutputStream dos = null;
    DataInputStream inStream = null;
    InputStream fileInputStream = null;
    ByteArrayOutputStream stream = null;

    try 
    {    
        if (ThisFile.isFile()) 
        {
            Bitmap Bm = Utility.decodeSampledBitmapFromResource(ThisFile.getPath(), 640, 480);
            stream = new ByteArrayOutputStream();
            Bm.compress(CompressFormat.JPEG, 100, stream);
            fileInputStream = new ByteArrayInputStream(stream.toByteArray());

            //fileInputStream = new FileInputStream(ThisFile);

            conn = (HttpURLConnection) new URL(Params.GetServiceUrl()+"/AddAdImage?AdItemId="+String.valueOf(AdItemId)+"&ContentType="+Utility.GetFileMimeType(ThisFile)+"&apikey="+Params.GetApiKey()).openConnection();
            conn.setDoInput(true);
            conn.setDoOutput(true);
            conn.setUseCaches(false);
            conn.setRequestMethod("POST");

            conn.setFixedLengthStreamingMode((int) ThisFile.length());// works fine till 24 mb file
            conn.setRequestProperty("Connection", "Keep-Alive");
            conn.setRequestProperty("Content-Type","application/stream");

            dos = new DataOutputStream(conn.getOutputStream());

            int maxBufferSize =  1 * 1024 * 1024;
            int bytesAvailable = fileInputStream.available();
            int bufferSize = Math.min(bytesAvailable,maxBufferSize);

            byte[] buffer = new byte[bufferSize];

            Log.i("Upload Ad Image", "Writing Stream");

            while ((bufferSize = fileInputStream.read(buffer)) > 0)
            {
                dos.write(buffer, 0, bufferSize);
            }

            Log.i("Upload Ad Image", "Stream Written");

            //dos.write(stream.toByteArray());

            String lineEnd = "";

            dos.writeBytes(lineEnd);

            Log.i("Upload Ad Image", "Line Written");

            // read the SERVER RESPONSE
            inStream = new DataInputStream(conn.getInputStream());
            String str = new String();
            String strResponse = new String();

            while ((str = inStream.readLine()) != null) 
            {
                strResponse += str;
            }

            inStream.close();

            dos.flush();
            dos.close();

            return Boolean.valueOf(strResponse);
        } 
    }
    catch (MalformedURLException ex)
    {
        Log.e("AddAdItemImage", "MalformedURLException: " + ex.getMessage(),ex);
    } 
    catch (IOException ioe)
    {
        Log.e("AddAdItemImage", "IOException: " + ioe.getMessage(),ioe);
    }
    catch (IllegalStateException e)
    {
        Log.e("AddAdItemImage", "IllegalStateException: " + e.getMessage(),e);
    }
    catch (Exception e)
    {
        Log.e("AddAdItemImage", "Exception: " + e.getMessage(),e);
    }
    finally
    {
        try
        {
            if(fileInputStream != null)
                fileInputStream.close();
        }
        catch (IOException e){} 

        try 
        {   
            if(stream!=null)
                stream.close();
        }
        catch (IOException e) {}
    }   

    return false;
}
4

1 回答 1

2

我解决了这个问题,就是这一行:

conn.setFixedLengthStreamingMode((int) ThisFile.length()); 

文件内容长度与新创建的位图不同后。我想知道我怎么能花将近两天的时间来找到解决方案;我想有时你只需要开箱即用:D

于 2012-11-06T11:36:13.193 回答