我试图将图像从Android客户端发送到python服务器,我之前已经使用python测试客户端和服务器实现了它。基本上我的客户端应用程序采用由用户详细信息和图像组成的表单。一旦用户选择了图像,我就会在onActivityResult方法中获取uri并将其解析为字符串,如此
selectedImagePath = selectedImageUri.toString();
当用户点击表单上的提交按钮时,将调用发送活动,并将表单数据作为附加组件中的附加内容进行调用。
Bundle b=new Bundle();
b.putStringArray("regValues", new String[]{name,email,selectedImagePath});
在发送活动中我与服务器建立连接并尝试发送图像。
` //与服务器建立链接
try{
//refer to the host computer's loopback interface
host = InetAddress.getByName("10.0.2.2");
link = new Socket(host,port);
in = new BufferedReader(new InputStreamReader(link.getInputStream()));
//access the strings that were passed to this activity
Bundle b = this.getIntent().getExtras();
String[] regFormValues = b.getStringArray("regValues");
//display connection confirmation
String message = in.readLine();
status.setText(message);
File myFile = new File (regFormValues[2]);
byte [] mybytearray = new byte [(int)myFile.length()];
FileInputStream fis = new FileInputStream(myFile);
BufferedInputStream bis = new BufferedInputStream(fis);
bis.read(mybytearray,0,mybytearray.length);
OutputStream os = link.getOutputStream();
os.write(mybytearray,0,mybytearray.length);
os.flush();
link.close();
}
catch(IOException e ){
e.printStackTrace();
}
`
它连接到服务器没问题, 服务器创建一个输出文件,以便像往常一样将数据写入,但它只显示为空,因此没有收到任何数据。我认为这可能是客户端文件路径的问题。有任何想法吗 ?
编辑:基本上我想知道我是否以正确的方式访问图像文件,或者您是否有更好的访问和发送建议。
答案 0 :(得分:0)
考虑使用File.exists()和File.isFile()等方法验证路径是否正常以及图像是否真的存在
同时检查图像是否甚至击中了电线 - 使用tcpdump ro wireshark
答案 1 :(得分:0)
我已经解决了这个问题,因为我use selectedImageUri = Uri.fromFile(photo);
获取了uri(如果它被摄像机拍摄)和selectedImageUri = data.getData();
(如果它被文件浏览器选中)。我使用selectedImagePath = selectedImagePath.substring(7);
来剥离文件://形成摄像机的图像路径,从而生成/ sdcard / etc或存储它的任何地方。要获取文件浏览器选择的图像的文件路径,我使用了这个
// convert the image URI to the direct file system path of the image file
public String getRealPathFromURI(Uri contentUri) {
// can post image
String [] proj={MediaStore.Images.Media.DATA};
Cursor cursor = managedQuery( contentUri,
proj, // Which columns to return
null, // WHERE clause; which rows to return (all rows)
null, // WHERE clause selection arguments (none)
null); // Order-by clause (ascending by name)
int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
cursor.moveToFirst();
return cursor.getString(column_index);
现在它按预期工作。