Golang 建立RESTful webservice 接收客戶端POST請求發送wav語音文件

   首先看下服務器端,服務器端使用martini框架,僅建立一個簡單的接收客戶端post請求並保存客戶端傳過來的語音的後臺服務:

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

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頭信息,最終發送數據:

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格式的識別結果。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章