gpt4 book ai didi

Android 无法将新创建的位图流写入 WCF 服务

转载 作者:行者123 更新时间:2023-11-29 21:56:06 25 4
gpt4 key购买 nike

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

IOException: expected bytes XXX but received 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;
}

最佳答案

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

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

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

关于Android 无法将新创建的位图流写入 WCF 服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13226876/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com