首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >android将文件名添加到bytestream

android将文件名添加到bytestream
EN

Stack Overflow用户
提问于 2011-09-11 04:27:35
回答 1查看 963关注 0票数 0

我正在尝试通过套接字在android中发送文件。我想添加带有bytestream的文件名,然后将其发送到服务器。我该怎么做?然后如何在接收端分隔文件名?这是发送文件的代码:

代码语言:javascript
复制
 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");
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-09-11 04:38:50

如果这是您自己的协议,那么您可以创建一个数据包,将两个部分(文件名和数据)分开。您需要清楚地表示通过特定边界的分离。

在服务器端,由于您了解协议,服务器将读回整个数据包,并根据给定的边界分离文件名和数据。

MIME data format就是使用这种数据交换,并广泛使用HTTP协议。如果使用相同的MIME数据格式,另一个好处是可以使用第三方库对数据进行编码和解码,如HttpMime

下面是使用MIME数据格式化数据并通过套接字发送数据的粗略代码

代码语言:javascript
复制
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.MultipartEntityorg.apache.http.entity.mime.content.InputStreamBody。在服务器上,您需要MIME解析器来获取文件名和所有字节内容

要在服务器上读回输入流,您需要一个类来解析MIME消息。您不必自己编写解析器,因为MIME已经是一种流行的消息格式,除非您想了解MIME消息结构。

下面是使用作为JavaMail一部分的MimeBodyPart的示例代码。

代码语言:javascript
复制
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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7374481

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档