通过URLConnection将音频文件从客户端传输到Http服务器

吉兹波

我目前正在我学校里从事一个编程项目。我需要将客户端的音频文件(MIDI格式)成功发送到Http服务器。我已经尝试过自己做这个,并且在Internet和Stackoverflow论坛上做了很多研究。当前可以将文件从客户端发送到服务器,但是在服务器端,音频文件无法播放。

以下是客户端代码:

private static void sendPOST() throws IOException{
    final int mid = 1;
    final String POST_URL = "http://localhost:8080/musiker/hörprobe?mid="+mid;
    final File uploadFile = new File("C://Users//Felix Ulbrich//Desktop//EIS Prototype MIDIs//Pop//BabyOneMoreTime.mid");
    String boundary = Long.toHexString(System.currentTimeMillis()); 
    String CRLF = "\r\n";
    String charset = "UTF-8";
    URLConnection connection = new URL(POST_URL).openConnection();
    connection.setDoOutput(true);
    connection.setRequestProperty("Content-Type", "multipart/form-data; boundary=" + boundary);
    try (
            OutputStream output = connection.getOutputStream();
            PrintWriter writer = new PrintWriter(new OutputStreamWriter(output, charset), true);
        ){
        writer.append("--" + boundary).append(CRLF);
        writer.append("Content-Disposition: form-data; name=\"binaryFile\"; filename=\"" + uploadFile.getName() + "\"").append(CRLF);
        writer.append("Content-Type: " + URLConnection.guessContentTypeFromName(uploadFile.getName())).append(CRLF);
        writer.append("Content-Transfer-Encoding: binary").append(CRLF);
        writer.append(CRLF).flush();
        Files.copy(uploadFile.toPath(), output);
        output.flush();
        writer.append(CRLF).flush();

        writer.append("--" + boundary + "--").append(CRLF).flush();

        int responseCode = ((HttpURLConnection) connection).getResponseCode();
        System.out.println(responseCode);
        }
}

以下是服务器端代码:

int FILE_SIZE = Integer.MAX_VALUE-2;
                    int bytesRead = 0;
                    int current = 0;
                    FileOutputStream fos = null;
                    BufferedOutputStream bos = null;
                    byte[] mybytearray = new byte[FILE_SIZE];
                    String FILE_TO_RECEIVED = "C://root//m"+musikerid+"hp"+(hörprobenzaehler+1)+".mid";
                    File f = new File(FILE_TO_RECEIVED);
                    if(!f.exists()){
                        f.createNewFile();
                    }
                    InputStream input = t.getRequestBody();
                    fos = new FileOutputStream(FILE_TO_RECEIVED);
                    bos = new BufferedOutputStream(fos);
                    bytesRead = input.read(mybytearray,0,mybytearray.length);
                    current = bytesRead;
                    do{
                        bytesRead = input.read(mybytearray, current, mybytearray.length-current);
                        if(bytesRead >= 0){
                            current += bytesRead;
                        }
                    }while(bytesRead>-1);

                    bos.write(mybytearray,0,current);
                    bos.flush();
                    fos.close();
                    bos.close();
                    t.sendResponseHeaders(200, 0);
                    input.close();

我现在非常绝望,因为我找不到解决此问题的任何方法。我需要使用HTTP服务器,但是我不需要使用TCP协议(现在通过流使用)。我想过通过ftp解决方案,所以我不需要先将文件转换为字节数组。我认为问题就在这里。服务器无法从字节数组正确创建音频文件(midi文件)。如果您中有人知道解决方案。请问,我需要你的帮助:D

问候,Gizpo

珍妮丝·库哈(Janetz Kuhar)

因此,我已对此问题进行了更深入的研究。我发现了几个问题:

  • 您正在混合基于二进制和字符的I / O。当您在客户端使用它时,服务器很难解决这个问题。
  • 您忘记指定要发送到服务器的文件的大小。在服务器端,您无法知道(除非有人事先告诉您)(传入文件的)大小。

我已经编辑了您的代码,并提出了以下建议:


客户:

private static void sendPOST() throws IOException{
        final int mid = 1;
        final String POST_URL = "http://localhost:8080/musiker/hörprobe?mid="+mid;
        final File uploadFile = new File("C://Users//Felix Ulbrich//Desktop//EIS Prototype MIDIs//Pop//BabyOneMoreTime.mid");

        String boundary = Long.toHexString(System.currentTimeMillis()); 
        String CRLF = "\r\n";
        String charset = "UTF-8";
        URLConnection connection = new URL(POST_URL).openConnection();
        connection.setDoOutput(true);
        connection.setRequestProperty("Content-Type", "multipart/form-data; boundary=" + boundary);
        
        try (
            OutputStream output = connection.getOutputStream();
            PrintWriter writer = new PrintWriter(new OutputStreamWriter(output, charset), true);
        ) {
            writer.append("--" + boundary).append(CRLF);
            writer.append("Content-Disposition: form-data; name=\"binaryFile\"; filename=\"" + uploadFile.getName() + "\"").append(CRLF);
            writer.append("Content-Length: " + uploadFile.length()).append(CRLF);
            writer.append("Content-Type: " + URLConnection.guessContentTypeFromName(uploadFile.getName())).append(CRLF);
            writer.append("Content-Transfer-Encoding: binary").append(CRLF);
            writer.append(CRLF).flush();
            Files.copy(uploadFile.toPath(), output);
            output.flush();

            int responseCode = ((HttpURLConnection) connection).getResponseCode();
            System.out.println("Response code: [" + responseCode + "]");
        }
    }

服务器:

@Override
public void handle(HttpExchange t) throws IOException {
    String CRLF = "\r\n";
    int fileSize = 0;
    
    String FILE_TO_RECEIVED = "C://root//m"+musikerid+"hp"+(hörprobenzaehler+1)+".mid";
    File f = new File(FILE_TO_RECEIVED);
    if (!f.exists()) {
        f.createNewFile();
    }
    
    InputStream input = t.getRequestBody();
    String nextLine = "";
    do {
        nextLine = readLine(input, CRLF);
        if (nextLine.startsWith("Content-Length:")) {
            fileSize = 
                Integer.parseInt(
                    nextLine.replaceAll(" ", "").substring(
                        "Content-Length:".length()
                    )
                );
        }
        System.out.println(nextLine);
    } while (!nextLine.equals(""));
    
    byte[] midFileByteArray = new byte[fileSize];
    int readOffset = 0;
    while (readOffset < fileSize) {
        int bytesRead = input.read(midFileByteArray, readOffset, fileSize);
        readOffset += bytesRead;
    }
    
    BufferedOutputStream bos = 
        new BufferedOutputStream(new FileOutputStream(FILE_TO_RECEIVED));
    
    bos.write(midFileByteArray, 0, fileSize);
    bos.flush();
    
    t.sendResponseHeaders(200, 0);
}

private static String readLine(InputStream is, String lineSeparator) 
    throws IOException {

    int off = 0, i = 0;
    byte[] separator = lineSeparator.getBytes("UTF-8");
    byte[] lineBytes = new byte[1024];
    
    while (is.available() > 0) {
        int nextByte = is.read();
        if (nextByte < -1) {
            throw new IOException(
                "Reached end of stream while reading the current line!");
        }
        
        lineBytes[i] = (byte) nextByte;
        if (lineBytes[i++] == separator[off++]) {
            if (off == separator.length) {
                return new String(
                    lineBytes, 0, i-separator.length, "UTF-8");
            }
        }
        else {
            off = 0;
        }
        
        if (i == lineBytes.length) {
            throw new IOException("Maximum line length exceeded: " + i);
        }
    }
    
    throw new IOException(
        "Reached end of stream while reading the current line!");       
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

将音频从客户端流传输到服务器再传输到多个客户端Java

来自分类Dev

通过Java中的套接字将文件从客户端传输到服务器

来自分类Dev

将原始音频数据从服务器流传输到客户端

来自分类Dev

使用socket.io-stream将文件从服务器流传输到客户端

来自分类Dev

如何将数据从服务器传输到客户端js文件?

来自分类Dev

通过服务器将S3中的图像流传输到客户端的最佳实践

来自分类Dev

在C中将文件从服务器传输到客户端时获取垃圾值?

来自分类Dev

使用Meteor将数据从服务器流传输到客户端:

来自分类Dev

是否可以使用WebRTC将视频从服务器流传输到客户端?

来自分类Dev

如何将SCP从Linux服务器传输到Windows客户端

来自分类Dev

如何使用SSH将Minecraft客户端隧道传输到MineOS服务器?

来自分类Dev

如何轻松地将服务器端变量从Java代码传输到客户端代码?

来自分类Dev

服务器/客户端之间的文件传输

来自分类Dev

从客户端到服务器的文件传输

来自分类Dev

通过网络传输文件:是从客户端发送还是从服务器发送?

来自分类Dev

PuTTY(PSFTP)是否使用二进制模式将文件从某个服务器传输到Windows客户端?

来自分类Dev

如何使用VB.NET将FTP服务器上唯一更新的文件传输到客户端计算机?

来自分类Dev

将 unsigned long long 从 C++ 服务器流式传输到 C# 客户端

来自分类Dev

Zookeeper 客户端会话将超时或传输到另一台服务器?

来自分类Dev

如何将实时视频帧从客户端流传输到flask服务器,再流回客户端?

来自分类Dev

Ruby如何通过TCP(http)服务器将图像发送到客户端

来自分类Dev

如何通过脚本将javascript文件从服务器复制到客户端pc

来自分类Dev

如何使用浏览器中的Flash客户端将网络摄像头流式传输到RTMP服务器?

来自分类Dev

使用Android HTTP客户端将文件上传到REST api服务器

来自分类Dev

在grpc客户端之间传输“斑点”-服务器

来自分类Dev

我如何测量服务器与客户端之间的http传输量(上载和下载)?

来自分类Dev

在客户端服务器套接字连接中正确传输文件

来自分类Dev

Go中的TCP客户端/服务器文件传输

来自分类Dev

需要从客户端到服务器传输多个文件

Related 相关文章

  1. 1

    将音频从客户端流传输到服务器再传输到多个客户端Java

  2. 2

    通过Java中的套接字将文件从客户端传输到服务器

  3. 3

    将原始音频数据从服务器流传输到客户端

  4. 4

    使用socket.io-stream将文件从服务器流传输到客户端

  5. 5

    如何将数据从服务器传输到客户端js文件?

  6. 6

    通过服务器将S3中的图像流传输到客户端的最佳实践

  7. 7

    在C中将文件从服务器传输到客户端时获取垃圾值?

  8. 8

    使用Meteor将数据从服务器流传输到客户端:

  9. 9

    是否可以使用WebRTC将视频从服务器流传输到客户端?

  10. 10

    如何将SCP从Linux服务器传输到Windows客户端

  11. 11

    如何使用SSH将Minecraft客户端隧道传输到MineOS服务器?

  12. 12

    如何轻松地将服务器端变量从Java代码传输到客户端代码?

  13. 13

    服务器/客户端之间的文件传输

  14. 14

    从客户端到服务器的文件传输

  15. 15

    通过网络传输文件:是从客户端发送还是从服务器发送?

  16. 16

    PuTTY(PSFTP)是否使用二进制模式将文件从某个服务器传输到Windows客户端?

  17. 17

    如何使用VB.NET将FTP服务器上唯一更新的文件传输到客户端计算机?

  18. 18

    将 unsigned long long 从 C++ 服务器流式传输到 C# 客户端

  19. 19

    Zookeeper 客户端会话将超时或传输到另一台服务器?

  20. 20

    如何将实时视频帧从客户端流传输到flask服务器,再流回客户端?

  21. 21

    Ruby如何通过TCP(http)服务器将图像发送到客户端

  22. 22

    如何通过脚本将javascript文件从服务器复制到客户端pc

  23. 23

    如何使用浏览器中的Flash客户端将网络摄像头流式传输到RTMP服务器?

  24. 24

    使用Android HTTP客户端将文件上传到REST api服务器

  25. 25

    在grpc客户端之间传输“斑点”-服务器

  26. 26

    我如何测量服务器与客户端之间的http传输量(上载和下载)?

  27. 27

    在客户端服务器套接字连接中正确传输文件

  28. 28

    Go中的TCP客户端/服务器文件传输

  29. 29

    需要从客户端到服务器传输多个文件

热门标签

归档