簡體   English   中英

通過 URLConnection 將音頻文件從客戶端傳輸到 Http 服務器

[英]Transfer Audio-File from Client to Http Server via URLConnection

我目前正在我的學校從事一個編程項目。 我需要將音頻文件(MIDI 格式)從客戶端成功發送到 Http 服務器。 我已經嘗試自己做這件事,並在互聯網和 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

所以我對這個問題進行了更深入的研究。 我發現了幾個問題:

  • 您正在混合基於二進制和字符的 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!");       
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM