且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

Golang 建立RESTful webservice 接收客户端POST请求发送wav语音文件

更新时间:2022-08-22 14:20:14

   首先看下服务器端,服务器端使用martini框架,仅建立一个简单的接收客户端post请求并保存客户端传过来的语音的后台服务:

   原文地址:http://liuxp0827.blog.51cto.com/5013343/1412977

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
package main
                         
//http://liuxp0827.blog.51cto.com/5013343/1412977                                                                                         
                       
import (
    "bufio"
    "github.com/go-martini/martini"
    "io/ioutil"
    "log"
    "net/http"
    "os"
)
                                                                                                                                                                                                   
func main() {
    m := martini.Classic()
                                                                                                                                                                                                   
    m.Post("/wave", func(req *http.Request) {
        file, _, err := req.FormFile("file")
        if err != nil {
            log.Fatal("FormFile: ", err.Error())
            os.Exit(2)
        }
        defer func() {
            if err := file.Close(); err != nil {
                log.Fatal("Close: ", err.Error())
                os.Exit(2)
            }
        }()
                                                                                                                                                                                                   
        localFile, _ := os.Create("1.wav")
        defer localFile.Close()
        writer := bufio.NewWriter(localFile)
        bytes, err := ioutil.ReadAll(file)
        if err != nil {
            log.Fatal("ReadAll: ", err.Error())
            os.Exit(2)
        }
                                                                                                                                                                                                   
        writer.Write(bytes)
        writer.Flush()
    })
                                                                                                                                                                                                   
    http.ListenAndServe(":8080", m)
}

   再来看下客户端的java代码,首先调用readWavform函数从本地读取语音文件到byte[],然后设置相应的POST头信息,最终发送数据:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
                                                                                          
                     
//http://liuxp0827.blog.51cto.com/5013343/1412977
                                                               
public final class upload {
                                                                                                                                   
    public static void main(String[] args) {
        Map<String, String> parameters = new HashMap<String, String>();                                                                
        byte[] data = readWavform("C:\\Users\\PONPON\\Desktop\\test.wav");
        doUploadFile("http://localhost:8080/wave", parameters,
                Constants.FILEPARAM, "11.wav""multipart/form-data;",
                data);
    }
                                                                                                                                   
    public static byte[] readWavform(String filename) {
                                                                                                                                   
        int regLen = 0;
        byte[] regbuffer = null;
        try {
            FileInputStream inputsteam = new FileInputStream(new File(filename));
                                                                                                                                   
            regLen = inputsteam.available();
            regbuffer = new byte[regLen];
            if ((regLen = inputsteam.read(regbuffer, 0, regLen)) < 0) {
                System.out.println("error when read pcm file.");
            }
                                                                                                                                   
        catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
                                                                                                                                   
        return regbuffer;
    }
                                                                                                                                   
    public static String doUploadFile(String reqUrl,
            Map<String, String> parameters, String fileParamName,
            String filename, String contentType, byte[] data) {
        HttpURLConnection urlConn = null;
        try {
            urlConn = sendFormdata(reqUrl, parameters, fileParamName, filename,
                    contentType, data);
            String responseContent = new String(getBytes(urlConn));
            return responseContent.trim();
        catch (Exception e) {
            throw new RuntimeException(e.getMessage(), e);
        finally {
            if (urlConn != null) {
                urlConn.disconnect();
            }
        }
    }
                                                                                                                                   
    private static HttpURLConnection sendFormdata(String reqUrl,
            Map<String, String> parameters, String fileParamName,
            String filename, String contentType, byte[] data) {
        HttpURLConnection urlConn = null;
        try {
            URL url = new URL(reqUrl);
            urlConn = (HttpURLConnection) url.openConnection();
            urlConn.setRequestMethod("POST");
            urlConn.setConnectTimeout(10000);// (单位:毫秒)jdk
            urlConn.setReadTimeout(10000);// (单位:毫秒)jdk 1.5换成这个,读操作超时
            urlConn.setDoOutput(true);
            urlConn.setRequestProperty("connection""keep-alive");
                                                                                                                                   
            String boundary = "-----------------------------114975832116442893661388290519"// 分隔符
            urlConn.setRequestProperty("Content-Type",
                    "multipart/form-data; boundary=" + boundary);
                                                                                                                                   
            boundary = "--" + boundary;
            StringBuffer params = new StringBuffer();
            if (parameters != null) {
                for (Iterator<String> iter = parameters.keySet().iterator(); iter
                        .hasNext();) {
                    String name = iter.next();
                    String value = parameters.get(name);
                    params.append(boundary + "\r\n");
                    params.append("Content-Disposition: form-data; name=\""
                            + name + "\"\r\n\r\n");
                    params.append(value);
                    params.append("\r\n");
                }
            }
            StringBuilder sb = new StringBuilder();
            sb.append(boundary);
            sb.append("\r\n");
            sb.append("Content-Disposition: form-data; name=\"" + fileParamName
                    "\"; filename=\"" + filename + "\"\r\n");
            sb.append("Content-Type: " + contentType + "\r\n\r\n");
            byte[] fileDiv = sb.toString().getBytes("UTF-8");
            byte[] endData = ("\r\n" + boundary + "--\r\n").getBytes("UTF-8");
            byte[] ps = params.toString().getBytes("UTF-8");
            OutputStream os = urlConn.getOutputStream();
            os.write(ps);
            os.write(fileDiv);
            os.write(data);
            os.write(endData);
            os.flush();
            os.close();
        catch (Exception e) {
            throw new RuntimeException(e.getMessage(), e);
        }
        return urlConn;
    }
    private static byte[] getBytes(HttpURLConnection urlConn) {
        try {
            InputStream in = urlConn.getInputStream();
            ByteArrayOutputStream os = new ByteArrayOutputStream();
            byte[] buf = new byte[1024];
            for (int i = 0; (i = in.read(buf)) > 0;)
                os.write(buf, 0, i);
            in.close();
            return os.toByteArray();
        catch (Exception e) {
            throw new RuntimeException(e.getMessage(), e);
        }
    }
}

   这只是简单的功能实现,后面可以用martini拓展,写一个简单的web语音识别服务,用android录音后发送POST请求,把语音数据发送到服务器处理识别,再返回json格式的识别结果。










本文转自 ponpon_ 51CTO博客,原文链接:http://blog.51cto.com/liuxp0827/1412977,如需转载请自行联系原作者