我正在尝试通过套接字在android中发送文件。我想添加带有bytestream的文件名,然后将其发送到服务器。我该怎么做?然后如何在接收端分隔文件名?这是发送文件的代码:
Log.i("SocketOP", "sendFILE-1");
File f = new File(path);
String filename=path.substring(path.lastIndexOf("/")+1);
System.out.println("filename:"+filename);
fin.filename = "~"+filename;
BufferedOutputStream out = new BufferedOutputStream( socket.getOutputStream() );
FileInputStream fileIn = new FileInputStream(f);
Log.i("SocketOP", "sendFILE-2");
byte [] buffer = new byte [(int)f.length()];
System.out.println("SO sendFile f.length();" + f.length());
int bytesRead =0;
while ((bytesRead = fileIn.read(buffer)) > 0) {
out.write(buffer, 0, buffer.length);
System.out.println("SO sendFile" + bytesRead +filename);
}
out.flush();
out.close();
fileIn.close();
Log.i("SocketOP", "sendFILE-3");发布于 2011-09-11 04:38:50
如果这是您自己的协议,那么您可以创建一个数据包,将两个部分(文件名和数据)分开。您需要清楚地表示通过特定边界的分离。
在服务器端,由于您了解协议,服务器将读回整个数据包,并根据给定的边界分离文件名和数据。
MIME data format就是使用这种数据交换,并广泛使用HTTP协议。如果使用相同的MIME数据格式,另一个好处是可以使用第三方库对数据进行编码和解码,如HttpMime
下面是使用MIME数据格式化数据并通过套接字发送数据的粗略代码
File f = new File(path);
BufferedOutputStream out = new BufferedOutputStream( socket.getOutputStream() );
String filename=path.substring(path.lastIndexOf("/")+1);
// create a multipart message
MultipartEntity multipartContent = new MultipartEntity();
// send the file inputstream as data
InputStreamBody isb = new InputStreamBody(new FileInputStream(f), "image/jpeg", filename);
// add key value pair. The key "imageFile" is arbitrary
multipartContent.addPart("imageFile", isb);
multipartContent.writeTo(out);
out.flush();
out.close();请注意,您将需要来自HttpMime项目的org.apache.http.entity.mime.MultipartEntity和org.apache.http.entity.mime.content.InputStreamBody。在服务器上,您需要MIME解析器来获取文件名和所有字节内容
要在服务器上读回输入流,您需要一个类来解析MIME消息。您不必自己编写解析器,因为MIME已经是一种流行的消息格式,除非您想了解MIME消息结构。
下面是使用作为JavaMail一部分的MimeBodyPart的示例代码。
MimeMultipart multiPartMessage = new MimeMultipart(new DataSource() {
@Override
public String getContentType() {
// this could be anything need be, this is just my test case and illustration
return "image/jpeg";
}
@Override
public InputStream getInputStream() throws IOException {
// socket is the socket that you get from Socket.accept()
BufferedInputStream inputStream = new BufferedInputStream(socket.getInputStream());
return inputStream;
}
@Override
public String getName() {
return "socketDataSource";
}
@Override
public OutputStream getOutputStream() throws IOException {
return socket.getOutputStream();
}
});
// get the first body of the multipart message
BodyPart bodyPart = multiPartMessage.getBodyPart(0);
// get the filename back from the message
String filename = bodyPart.getFileName();
// get the inputstream back
InputStream bodyInputStream = bodyPart.getInputStream();
// do what you need to do here....您可以从Oracle Website下载JavaMail,它也依赖于Java Activation Framework
https://stackoverflow.com/questions/7374481
复制相似问题