我试图从服务器读取图像文件,代码如下。它继续进入例外。我知道正在发送正确的字节数,因为我在收到时打印出来。我像这样从python发送图像文件
#open the image file and read it into an object
imgfile = open (marked_image, 'rb')
obj = imgfile.read()
#get the no of bytes in the image and convert it to a string
bytes = str(len(obj))
#send the number of bytes
self.conn.send( bytes + '\n')
if self.conn.sendall(obj) == None:
imgfile.flush()
imgfile.close()
print 'Image Sent'
else:
print 'Error'
这是android部分,这是我遇到问题的地方。有关接收图像并将其写入文件的最佳方法的任何建议吗?
//read the number of bytes in the image
String noOfBytes = in.readLine();
Toast.makeText(this, noOfBytes, 5).show();
byte bytes [] = new byte [Integer.parseInt(noOfBytes)];
//create a file to store the retrieved image
File photo = new File(Environment.getExternalStorageDirectory(), "PostKey.jpg");
DataInputStream dis = new DataInputStream(link.getInputStream());
try{
os =new FileOutputStream(photo);
byte buf[]=new byte[1024];
int len;
while((len=dis.read(buf))>0)
os.write(buf,0,len);
Toast.makeText(this, "File recieved", 5).show();
os.close();
dis.close();
}catch(IOException e){
Toast.makeText(this, "An IO Error Occured", 5).show();
}
编辑:我似乎仍然无法让它发挥作用。从那以后我一直在这里,我所有努力的结果要么导致文件不是完整的大小,要么是应用程序崩溃。我知道在发送服务器端之前文件没有损坏。据我所知,它肯定会发送,因为python中的send all方法发送全部或在发生错误时抛出异常,到目前为止它从未抛出异常。所以客户端搞砸了。我必须从服务器发送文件,所以我不能使用Brian建议的建议。
答案 0 :(得分:1)
从服务器获取位图的最佳方法是执行以下操作。
HttpClient client = new DefaultHttpClient();
HttpGet get = new HttpGet("http://yoururl");
HttpResponse response = client.execute(get);
InputStream is = response.getEntity().getContent();
Bitmap image = BitmapFactory.decodeStream(is);
这将为您提供位图,将其保存到文件中执行以下操作。
FileOutputStream fos = new FileOutputStream("yourfilename");
image.compress(CompressFormat.PNG, 1, fos);
fos.close();
您也可以将两者合并,直接写入磁盘
HttpClient client = new DefaultHttpClient();
HttpGet get = new HttpGet("http://yoururl");
HttpResponse response = client.execute(get);
InputStream is = response.getEntity().getContent();
FileOutputStream fos = new FileOutputStream("yourfilename");
byte[] buffer = new byte[256];
int read = is.read(buffer);
while(read != -1){
fos.write(buffer, 0, read);
read = is.read(buffer);
}
fos.close();
is.close();
希望这会有所帮助;
答案 1 :(得分:0)
我不确定我理解你的代码。您正在致电dis.readFully(bytes);
将dis
的内容写入byte
数组。但是你不对数组做任何事情,然后尝试通过缓冲区将dis
的内容写入FileOutputStream
。
尝试注释掉dis.readFully(bytes);
行。
作为旁注,我会写日志而不是弹出一个吐司,比如字节数或发生异常时:
...
} catch (IOException e) {
Log.e("MyTagName","Exception caught " + e.toString());
e.printStackTrace();
}
您可以查看这些链接,了解将文件写入SD卡的示例:
答案 2 :(得分:-1)
我在Ubuntu论坛成员的帮助下解决了这个问题。这是问题的字节读数。它正在削减图像中的一些字节。解决方案是只发送整个图像并从方程中一起删除字节的发送