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
<code>package</code> <code>main</code>
<code> </code>
<code>//http://liuxp0827.blog.51cto.com/5013343/1412977 </code>
<code> </code>
<code>import</code> <code>(</code>
<code> </code><code>"bufio"</code>
<code> </code><code>"github.com/go-martini/martini"</code>
<code> </code><code>"io/ioutil"</code>
<code> </code><code>"log"</code>
<code> </code><code>"net/http"</code>
<code> </code><code>"os"</code>
<code>)</code>
<code> </code>
<code>func main() {</code>
<code> </code><code>m := martini.Classic()</code>
<code> </code><code>m.Post(</code><code>"/wave"</code><code>, func(req *http.Request) {</code>
<code> </code><code>file, _, err := req.FormFile(</code><code>"file"</code><code>)</code>
<code> </code><code>if</code> <code>err != nil {</code>
<code> </code><code>log.Fatal(</code><code>"FormFile: "</code><code>, err.Error())</code>
<code> </code><code>os.Exit(</code><code>2</code><code>)</code>
<code> </code><code>}</code>
<code> </code><code>defer func() {</code>
<code> </code><code>if</code> <code>err := file.Close(); err != nil {</code>
<code> </code><code>log.Fatal(</code><code>"Close: "</code><code>, err.Error())</code>
<code> </code><code>os.Exit(</code><code>2</code><code>)</code>
<code> </code><code>}</code>
<code> </code><code>}()</code>
<code> </code><code>localFile, _ := os.Create(</code><code>"1.wav"</code><code>)</code>
<code> </code><code>defer localFile.Close()</code>
<code> </code><code>writer := bufio.NewWriter(localFile)</code>
<code> </code><code>bytes, err := ioutil.ReadAll(file)</code>
<code> </code><code>log.Fatal(</code><code>"ReadAll: "</code><code>, err.Error())</code>
<code> </code><code>writer.Write(bytes)</code>
<code> </code><code>writer.Flush()</code>
<code> </code><code>})</code>
<code> </code><code>http.ListenAndServe(</code><code>":8080"</code><code>, m)</code>
<code>}</code>
再来看下客户端的java代码,首先调用readWavform函数从本地读取语音文件到byte[],然后设置相应的POST头信息,最终发送数据:
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
<code>import</code> <code>java.io.ByteArrayOutputStream;</code>
<code>import</code> <code>java.io.File;</code>
<code>import</code> <code>java.io.FileInputStream;</code>
<code>import</code> <code>java.io.FileNotFoundException;</code>
<code>import</code> <code>java.io.IOException;</code>
<code>import</code> <code>java.io.InputStream;</code>
<code>import</code> <code>java.io.OutputStream;</code>
<code>import</code> <code>java.net.HttpURLConnection;</code>
<code>import</code> <code>java.net.URL;</code>
<code>import</code> <code>java.util.HashMap;</code>
<code>import</code> <code>java.util.Iterator;</code>
<code>import</code> <code>java.util.Map;</code>
<code> </code>
<code> </code>
<code>//http://liuxp0827.blog.51cto.com/5013343/1412977</code>
<code> </code>
<code>public</code> <code>final</code> <code>class</code> <code>upload {</code>
<code> </code>
<code> </code><code>public</code> <code>static</code> <code>void</code> <code>main(String[] args) {</code>
<code> </code><code>Map<String, String> parameters = </code><code>new</code> <code>HashMap<String, String>(); </code>
<code> </code><code>byte</code><code>[] data = readWavform(</code><code>"C:\\Users\\PONPON\\Desktop\\test.wav"</code><code>);</code>
<code> </code><code>doUploadFile(</code><code>"http://localhost:8080/wave"</code><code>, parameters,</code>
<code> </code><code>Constants.FILEPARAM, </code><code>"11.wav"</code><code>, </code><code>"multipart/form-data;"</code><code>,</code>
<code> </code><code>data);</code>
<code> </code><code>}</code>
<code> </code><code>public</code> <code>static</code> <code>byte</code><code>[] readWavform(String filename) {</code>
<code> </code><code>int</code> <code>regLen = </code><code>0</code><code>;</code>
<code> </code><code>byte</code><code>[] regbuffer = </code><code>null</code><code>;</code>
<code> </code><code>try</code> <code>{</code>
<code> </code><code>FileInputStream inputsteam = </code><code>new</code> <code>FileInputStream(</code><code>new</code> <code>File(filename));</code>
<code> </code><code>regLen = inputsteam.available();</code>
<code> </code><code>regbuffer = </code><code>new</code> <code>byte</code><code>[regLen];</code>
<code> </code><code>if</code> <code>((regLen = inputsteam.read(regbuffer, </code><code>0</code><code>, regLen)) < </code><code>0</code><code>) {</code>
<code> </code><code>System.out.println(</code><code>"error when read pcm file."</code><code>);</code>
<code> </code><code>} </code><code>catch</code> <code>(FileNotFoundException e) {</code>
<code> </code><code>// TODO Auto-generated catch block</code>
<code> </code><code>e.printStackTrace();</code>
<code> </code><code>} </code><code>catch</code> <code>(IOException e) {</code>
<code> </code><code>return</code> <code>regbuffer;</code>
<code> </code><code>public</code> <code>static</code> <code>String doUploadFile(String reqUrl,</code>
<code> </code><code>Map<String, String> parameters, String fileParamName,</code>
<code> </code><code>String filename, String contentType, </code><code>byte</code><code>[] data) {</code>
<code> </code><code>HttpURLConnection urlConn = </code><code>null</code><code>;</code>
<code> </code><code>urlConn = sendFormdata(reqUrl, parameters, fileParamName, filename,</code>
<code> </code><code>contentType, data);</code>
<code> </code><code>String responseContent = </code><code>new</code> <code>String(getBytes(urlConn));</code>
<code> </code><code>return</code> <code>responseContent.trim();</code>
<code> </code><code>} </code><code>catch</code> <code>(Exception e) {</code>
<code> </code><code>throw</code> <code>new</code> <code>RuntimeException(e.getMessage(), e);</code>
<code> </code><code>} </code><code>finally</code> <code>{</code>
<code> </code><code>if</code> <code>(urlConn != </code><code>null</code><code>) {</code>
<code> </code><code>urlConn.disconnect();</code>
<code> </code><code>private</code> <code>static</code> <code>HttpURLConnection sendFormdata(String reqUrl,</code>
<code> </code><code>URL url = </code><code>new</code> <code>URL(reqUrl);</code>
<code> </code><code>urlConn = (HttpURLConnection) url.openConnection();</code>
<code> </code><code>urlConn.setRequestMethod(</code><code>"POST"</code><code>);</code>
<code> </code><code>urlConn.setConnectTimeout(</code><code>10000</code><code>);</code><code>// (单位:毫秒)jdk</code>
<code> </code><code>urlConn.setReadTimeout(</code><code>10000</code><code>);</code><code>// (单位:毫秒)jdk 1.5换成这个,读操作超时</code>
<code> </code><code>urlConn.setDoOutput(</code><code>true</code><code>);</code>
<code> </code><code>urlConn.setRequestProperty(</code><code>"connection"</code><code>, </code><code>"keep-alive"</code><code>);</code>
<code> </code><code>String boundary = </code><code>"-----------------------------114975832116442893661388290519"</code><code>; </code><code>// 分隔符</code>
<code> </code><code>urlConn.setRequestProperty(</code><code>"Content-Type"</code><code>,</code>
<code> </code><code>"multipart/form-data; boundary="</code> <code>+ boundary);</code>
<code> </code><code>boundary = </code><code>"--"</code> <code>+ boundary;</code>
<code> </code><code>StringBuffer params = </code><code>new</code> <code>StringBuffer();</code>
<code> </code><code>if</code> <code>(parameters != </code><code>null</code><code>) {</code>
<code> </code><code>for</code> <code>(Iterator<String> iter = parameters.keySet().iterator(); iter</code>
<code> </code><code>.hasNext();) {</code>
<code> </code><code>String name = iter.next();</code>
<code> </code><code>String value = parameters.get(name);</code>
<code> </code><code>params.append(boundary + </code><code>"\r\n"</code><code>);</code>
<code> </code><code>params.append(</code><code>"Content-Disposition: form-data; name=\""</code>
<code> </code><code>+ name + </code><code>"\"\r\n\r\n"</code><code>);</code>
<code> </code><code>params.append(value);</code>
<code> </code><code>params.append(</code><code>"\r\n"</code><code>);</code>
<code> </code><code>}</code>
<code> </code><code>StringBuilder sb = </code><code>new</code> <code>StringBuilder();</code>
<code> </code><code>sb.append(boundary);</code>
<code> </code><code>sb.append(</code><code>"\r\n"</code><code>);</code>
<code> </code><code>sb.append(</code><code>"Content-Disposition: form-data; name=\""</code> <code>+ fileParamName</code>
<code> </code><code>+ </code><code>"\"; filename=\""</code> <code>+ filename + </code><code>"\"\r\n"</code><code>);</code>
<code> </code><code>sb.append(</code><code>"Content-Type: "</code> <code>+ contentType + </code><code>"\r\n\r\n"</code><code>);</code>
<code> </code><code>byte</code><code>[] fileDiv = sb.toString().getBytes(</code><code>"UTF-8"</code><code>);</code>
<code> </code><code>byte</code><code>[] endData = (</code><code>"\r\n"</code> <code>+ boundary + </code><code>"--\r\n"</code><code>).getBytes(</code><code>"UTF-8"</code><code>);</code>
<code> </code><code>byte</code><code>[] ps = params.toString().getBytes(</code><code>"UTF-8"</code><code>);</code>
<code> </code><code>OutputStream os = urlConn.getOutputStream();</code>
<code> </code><code>os.write(ps);</code>
<code> </code><code>os.write(fileDiv);</code>
<code> </code><code>os.write(data);</code>
<code> </code><code>os.write(endData);</code>
<code> </code><code>os.flush();</code>
<code> </code><code>os.close();</code>
<code> </code><code>return</code> <code>urlConn;</code>
<code> </code><code>private</code> <code>static</code> <code>byte</code><code>[] getBytes(HttpURLConnection urlConn) {</code>
<code> </code><code>InputStream in = urlConn.getInputStream();</code>
<code> </code><code>ByteArrayOutputStream os = </code><code>new</code> <code>ByteArrayOutputStream();</code>
<code> </code><code>byte</code><code>[] buf = </code><code>new</code> <code>byte</code><code>[</code><code>1024</code><code>];</code>
<code> </code><code>for</code> <code>(</code><code>int</code> <code>i = </code><code>0</code><code>; (i = in.read(buf)) > </code><code>0</code><code>;)</code>
<code> </code><code>os.write(buf, </code><code>0</code><code>, i);</code>
<code> </code><code>in.close();</code>
<code> </code><code>return</code> <code>os.toByteArray();</code>
这只是简单的功能实现,后面可以用martini拓展,写一个简单的web语音识别服务,用android录音后发送POST请求,把语音数据发送到服务器处理识别,再返回json格式的识别结果。
本文转自 ponpon_ 51CTO博客,原文链接:http://blog.51cto.com/liuxp0827/1412977,如需转载请自行联系原作者