将位图流写入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;
}
答案 0 :(得分:2)
我解决了这个问题,就是这一行:
conn.setFixedLengthStreamingMode((int) ThisFile.length());
文件内容长度与新创建的位图不同。我想知道如何花两天时间找到解决方案;我想有时你只需要开箱即用:D