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()); 

ファイル コンテンツの長さが、新しく作成されたビットマップと異なっていました。どうすれば解決策を見つけるのにほぼ 2 日も費やすことができるのだろうか。私は時々あなたが箱から出して考える必要があると思います:D

于 2012-11-06T11:36:13.193 に答える