2016-07-27 37 views
0

我想一些图像文件从Android手机转移,通过套接字,到服务器。到目前为止,我在android上发现的唯一方法是使用FileInputStream将图像作为字节数组读取,然后通过套接字将其发送到服务器端进行重构。这很好,不幸的是,Android(或Java?)不允许元数据(在我的情况下是exif数据)包含在FileInputStream中。这意味着,一旦图像在服务器上,我的exif数据就会丢失。Android文件传输,包括Exif数据中

我试着用两个ExifInterface来解决这个问题,它似乎无法读取我需要的很多exif数据和Metadata library。元数据库似乎得到了我想要的所有exif数据,但我无法弄清楚如何将它写出来作为可以通过我的流发送的字节,它只有一个toString,它可以去掉一些需要的数据被转移。

理想我很乐意的方式将文件与它传递的元数据,但是我很高兴有办法把元数据标签到我可以添加到我的套接字的输出流的字节。

这里是一个在插槽

FileInputStream in = new FileInputStream(lastSavedPath); byte[] buffer = new byte[1024]; int length = 0; while ((length = in.read(buffer, 0, buffer.length)) != -1){ outputStream.write(buffer, 0, length); } ExifInterface exifInterface = new ExifInterface(lastSavedPath); Metadata metadata = ImageMetadataReader.readMetadata(new File(lastSavedPath)); for (Directory directory : metadata.getDirectories()){ for (Tag tag : directory.getTags()){ Log.d("Socket Listener", tag.toString()); if (tag.toString().indexOf("Exif")>=0) Log.d("Socket exif", "Data"+exifInterface.getAttribute(tag.getTagName())); } } outputStream.flush(); Log.d("Socket Listener", "Data has been sent"); in.close(); socket.close();

+0

你的问题不清楚。一个'FileInputStream'只是逐字节读取一个文件。如果在服务器端缺少Exif数据,那么它们不包含在您读取的文件中。可能是你读过错误的文件?请编辑您的问题,并附上相关的代码示例和更多详细信息。 – Robert

+0

Android的API不允许从流http://stackoverflow.com/questions/12944123/reading-android-jpeg-exif-metadata-from-picture-callback读取元数据。我可以确认这些文件确实具有exif数据,因为我已经通过adb将它们下载以检查它们。 – Jamjarman

+0

恕我直言,你仍然不清楚你想达到什么以及应该在哪里完成(Android或服务器端)。 – Robert

回答

0

这里的问题是不是与Android在所有上传文件的代码。我已经读过另一个线程,android的FileInputStream没有包含元数据,但事实并非如此。我相信现在问题出现在我的服务器端代码中。我已经固定用下面的代码的问题:

服务器端(需要在一个尝试捕捉):

socket = new Socket(args[0], 8888); 
    dataOutputStream = new DataOutputStream(socket.getOutputStream()); 
    dataInputStream = new DataInputStream(socket.getInputStream()); 
    dataOutputStream.writeUTF(args[1]); 
    System.out.println("Saving image"); 
    FileOutputStream fileout = new FileOutputStream("/home/jamie/Documents/UMDSummer16/Thermal/TemporalAnalysisSensor/SocketTest/"+args[2]); 
    byte[] bytes = new byte[1024]; 
    int count; 
    while ((count = dataInputStream.read(bytes)) > 0){ 
     fileout.write(bytes); 
    } 
    fileout.close(); 
    dataInputStream.close(); 

的Android端(也处于尝试捕捉):

FileInputStream in = new FileInputStream(lastSavedPath); 
byte[] buffer = new byte[1024]; 
int length = 0; 
while ((length = in.read(buffer, 0, buffer.length)) != -1) { 
    outputStream.write(buffer, 0, length); 
} 
outputStream.flush(); 
Log.d("Socket Listener", "Data has been sent"); 
in.close(); 
socket.close();