Java 如何使用URLConnection上传WAV文件
目前,我可以在终端(MAC)中使用以下命令上载.wav文件: 我想在Android上做同样的事情。到目前为止,我已经使用内部的URLConnection实现了一个AsyncTask,我发送了头文件和所有内容,除了wave文件。得到一个json响应,显然没有上传任何文件,但到目前为止还不错,我知道我正确地实现了头文件和连接。 现在,我想上传.wav文件来总结一切,但我在这里有点迷路了。 如何使用URLConnection在Android中上传.wav文件???以下是我的代码,它位于AsyncTask中,我不会将其放入其中,以保持简短:Java 如何使用URLConnection上传WAV文件,java,android,android-studio,file-upload,urlconnection,Java,Android,Android Studio,File Upload,Urlconnection,目前,我可以在终端(MAC)中使用以下命令上载.wav文件: 我想在Android上做同样的事情。到目前为止,我已经使用内部的URLConnection实现了一个AsyncTask,我发送了头文件和所有内容,除了wave文件。得到一个json响应,显然没有上传任何文件,但到目前为止还不错,我知道我正确地实现了头文件和连接。 现在,我想上传.wav文件来总结一切,但我在这里有点迷路了。 如何使用URLConnection在Android中上传.wav文件???以下是我的代码,它位于AsyncTas
URL obj = new URL(BASE_URL);
HttpURLConnection conn = (HttpURLConnection) obj.openConnection();
conn.setRequestProperty("X-Arg", "AccessKey=3fcb4985-2830-07ce-e998-4e74df5a3f8f");
conn.setRequestProperty("Content-Type", "audio/wav");
conn.setRequestMethod("POST");
conn.setDoInput(true);
conn.setDoOutput(true);
String wavpath=Environment.getExternalStorageDirectory().getAbsolutePath()+"/audio.wav";
File wavfile = new File(wavpath);
boolean success = true;
if (wavfile.exists()) {
app.loge("**** audio.wav DETECTED");
}
else{
app.loge("**** audio.wav MISSING");
}
conn.connect();
//CODE TO UPLOAD THE FILE SHOULD GO HERE!!
int responseCode = conn.getResponseCode();
app.logy("POST Response Code : " + responseCode);
//Fetch response JSON
if (responseCode == HttpURLConnection.HTTP_OK) { //success
BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
app.loge(response.toString());
result = 1;
} else {
app.loge("POST FAILED");
result = 0;
}
我终于找到了上传wav文件的方法。有些服务器接受或拒绝上传请求的方式略有不同。在另一个问题中,我试图在另一台服务器上完成相同的任务,结果证明这比我将要在这个答案中分享的任务要复杂得多,但是如果您仍然无法使事情正常工作,请查看它。 要将CURL请求直接“翻译”成java而不影响NDK,没有捷径可走。 对于这个问题,这是对我有用的代码:
final String ASR_URL="http:..... ";
public class curlAudioToWatson extends AsyncTask<String, Void, String> {
String asrJsonString="";
@Override
protected String doInBackground(String... params) {
String result = "";
try {
loge("**** UPLOADING .WAV to ASR...");
URL obj = new URL(ASR_URL);
HttpURLConnection conn = (HttpURLConnection) obj.openConnection();
conn.setRequestProperty("X-Arg", "AccessKey=3fvfg985-2830-07ce-e998-4e74df");
conn.setRequestProperty("Content-Type", "audio/wav");
conn.setRequestMethod("POST");
conn.setDoInput(true);
conn.setDoOutput(true);
String wavpath=Environment.getExternalStorageDirectory().getAbsolutePath()+"/my AppFolder/"+StorageUtils.AUDIO_FILE_NAME+".wav"; //audio.wav";
File wavfile = new File(wavpath);
boolean success = true;
if (wavfile.exists()) {
loge("**** audio.wav DETECTED: "+wavfile);
}
else{
loge("**** audio.wav MISSING: " +wavfile);
}
String charset="UTF-8";
String boundary = Long.toHexString(System.currentTimeMillis()); // Just generate some unique random value.
String CRLF = "\r\n"; // Line separator required by multipart/form-data.
OutputStream output=null;
PrintWriter writer=null;
try {
output = conn.getOutputStream();
writer = new PrintWriter(new OutputStreamWriter(output, charset), true);
byte [] music=new byte[(int) wavfile.length()];//size & length of the file
InputStream is = new FileInputStream (wavfile);
BufferedInputStream bis = new BufferedInputStream (is, 16000);
DataInputStream dis = new DataInputStream (bis); // Create a DataInputStream to read the audio data from the saved file
int i = 0;
copyStream(dis,output);
}
catch(Exception e){
}
conn.connect();
int responseCode = conn.getResponseCode();
logy("POST Response Code : " + responseCode + " , MSG: " + conn.getResponseMessage());
if (responseCode == HttpURLConnection.HTTP_OK) { //success
BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
loge("***ASR RESULT: " + response.toString());
JSONArray jresponse=new JSONObject(response.toString()).getJSONObject("Recognition").getJSONArray("NBest");
asrJsonString=jresponse.toString();
for(int i = 0 ; i < jresponse.length(); i++){
JSONObject jsoni=jresponse.getJSONObject(i);
if(jsoni.has("ResultText")){
String asrResult=jsoni.getString("ResultText");
//ActionManager.getInstance().addDebugMessage("ASR Result: "+asrResult);
loge("*** Result Text: "+asrResult);
result = asrResult;
}
}
loge("***ASR RESULT: " + jresponse.toString());
} else {
BufferedReader in = new BufferedReader(new InputStreamReader(conn.getErrorStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
loge("POST FAILED: " + response.toString());
result = "";
}
} catch (Exception e) {
logy("HTTP Exception: " + e.getLocalizedMessage());
}
return result; //"Failed to fetch data!";
}
@Override
protected void onPostExecute(String result) {
if(!result.equals("")){
logy("onPostEXECUTE SUCCESS, consuming result");
sendTextInputFromUser(result);
ActionManager.getInstance().addDebugMessage("***ASR RESULT: "+asrJsonString);
runOnUiThread(new Runnable() {
@Override
public void run() {
}
});
}else{
logy("onPostEXECUTE FAILED");
}
}
}
public void copyStream( InputStream is, OutputStream os) {
final int buffer_size = 4096;
try {
byte[] bytes = new byte[buffer_size];
int k=-1;
double prog=0;
while ((k = is.read(bytes, 0, bytes.length)) > -1) {
if(k != -1) {
os.write(bytes, 0, k);
prog=prog+k;
double progress = ((long) prog)/1000;///size;
loge("UPLOADING: "+progress+" kB");
}
}
os.flush();
is.close();
os.close();
} catch (Exception ex) {
loge("File to Network Stream Copy error "+ex);
}
}
最终字符串ASR_URL=“http:…”;
公共类curlAudioToWatson扩展异步任务{
字符串asrJsonString=“”;
@凌驾
受保护的字符串doInBackground(字符串…参数){
字符串结果=”;
试一试{
loge(“****上传.WAV到ASR…”);
URL obj=新URL(ASR_URL);
HttpURLConnection conn=(HttpURLConnection)obj.openConnection();
conn.setRequestProperty(“X-Arg”,“AccessKey=3fvfg985-2830-07ce-e998-4e74df”);
conn.setRequestProperty(“内容类型”、“音频/wav”);
conn.setRequestMethod(“POST”);
conn.setDoInput(真);
连接设置输出(真);
字符串wavpath=Environment.getExternalStorageDirectory().getAbsolutePath()+“/my AppFolder/“+StorageUtils.AUDIO\u FILE\u NAME+”.wav“//AUDIO.wav”;
文件wavfile=新文件(wavpath);
布尔成功=真;
if(wavfile.exists()){
loge(“**audio.wav检测到:”+wavfile);
}
否则{
loge(“**audio.wav缺少:“+wavfile”);
}
字符串charset=“UTF-8”;
String boundary=Long.toHexString(System.currentTimeMillis());//只需生成一些唯一的随机值即可。
字符串CRLF=“\r\n”;//多部分/表单数据需要行分隔符。
OutputStream输出=null;
PrintWriter=null;
试一试{
output=conn.getOutputStream();
writer=新的PrintWriter(新的OutputStreamWriter(输出,字符集),true);
byte[]music=新字节[(int)wavfile.length()];//文件的大小和长度
InputStream is=新文件InputStream(wavfile);
BufferedInputStream bis=新的BufferedInputStream(is,16000);
DataInputStream dis=new DataInputStream(bis);//创建DataInputStream以从保存的文件读取音频数据
int i=0;
复制流(dis,输出);
}
捕获(例外e){
}
连接();
int responseCode=conn.getResponseCode();
逻辑(“后响应代码:+responseCode+”,消息:+conn.getResponseMessage());
如果(responseCode==HttpURLConnection.HTTP_OK){//success
BufferedReader in=新的BufferedReader(新的InputStreamReader(conn.getInputStream());
字符串输入线;
StringBuffer响应=新的StringBuffer();
而((inputLine=in.readLine())!=null){
追加(inputLine);
}
in.close();
loge(“***ASR结果:“+response.toString());
JSONArray jresponse=新的JSONObject(response.toString()).getJSONObject(“识别”).getJSONArray(“NBest”);
asrJsonString=jresponse.toString();
for(int i=0;ifinal String ASR_URL="http:..... ";
public class curlAudioToWatson extends AsyncTask<String, Void, String> {
String asrJsonString="";
@Override
protected String doInBackground(String... params) {
String result = "";
try {
loge("**** UPLOADING .WAV to ASR...");
URL obj = new URL(ASR_URL);
HttpURLConnection conn = (HttpURLConnection) obj.openConnection();
conn.setRequestProperty("X-Arg", "AccessKey=3fvfg985-2830-07ce-e998-4e74df");
conn.setRequestProperty("Content-Type", "audio/wav");
conn.setRequestMethod("POST");
conn.setDoInput(true);
conn.setDoOutput(true);
String wavpath=Environment.getExternalStorageDirectory().getAbsolutePath()+"/my AppFolder/"+StorageUtils.AUDIO_FILE_NAME+".wav"; //audio.wav";
File wavfile = new File(wavpath);
boolean success = true;
if (wavfile.exists()) {
loge("**** audio.wav DETECTED: "+wavfile);
}
else{
loge("**** audio.wav MISSING: " +wavfile);
}
String charset="UTF-8";
String boundary = Long.toHexString(System.currentTimeMillis()); // Just generate some unique random value.
String CRLF = "\r\n"; // Line separator required by multipart/form-data.
OutputStream output=null;
PrintWriter writer=null;
try {
output = conn.getOutputStream();
writer = new PrintWriter(new OutputStreamWriter(output, charset), true);
byte [] music=new byte[(int) wavfile.length()];//size & length of the file
InputStream is = new FileInputStream (wavfile);
BufferedInputStream bis = new BufferedInputStream (is, 16000);
DataInputStream dis = new DataInputStream (bis); // Create a DataInputStream to read the audio data from the saved file
int i = 0;
copyStream(dis,output);
}
catch(Exception e){
}
conn.connect();
int responseCode = conn.getResponseCode();
logy("POST Response Code : " + responseCode + " , MSG: " + conn.getResponseMessage());
if (responseCode == HttpURLConnection.HTTP_OK) { //success
BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
loge("***ASR RESULT: " + response.toString());
JSONArray jresponse=new JSONObject(response.toString()).getJSONObject("Recognition").getJSONArray("NBest");
asrJsonString=jresponse.toString();
for(int i = 0 ; i < jresponse.length(); i++){
JSONObject jsoni=jresponse.getJSONObject(i);
if(jsoni.has("ResultText")){
String asrResult=jsoni.getString("ResultText");
//ActionManager.getInstance().addDebugMessage("ASR Result: "+asrResult);
loge("*** Result Text: "+asrResult);
result = asrResult;
}
}
loge("***ASR RESULT: " + jresponse.toString());
} else {
BufferedReader in = new BufferedReader(new InputStreamReader(conn.getErrorStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
loge("POST FAILED: " + response.toString());
result = "";
}
} catch (Exception e) {
logy("HTTP Exception: " + e.getLocalizedMessage());
}
return result; //"Failed to fetch data!";
}
@Override
protected void onPostExecute(String result) {
if(!result.equals("")){
logy("onPostEXECUTE SUCCESS, consuming result");
sendTextInputFromUser(result);
ActionManager.getInstance().addDebugMessage("***ASR RESULT: "+asrJsonString);
runOnUiThread(new Runnable() {
@Override
public void run() {
}
});
}else{
logy("onPostEXECUTE FAILED");
}
}
}
public void copyStream( InputStream is, OutputStream os) {
final int buffer_size = 4096;
try {
byte[] bytes = new byte[buffer_size];
int k=-1;
double prog=0;
while ((k = is.read(bytes, 0, bytes.length)) > -1) {
if(k != -1) {
os.write(bytes, 0, k);
prog=prog+k;
double progress = ((long) prog)/1000;///size;
loge("UPLOADING: "+progress+" kB");
}
}
os.flush();
is.close();
os.close();
} catch (Exception ex) {
loge("File to Network Stream Copy error "+ex);
}
}
String requestURL = "https://api.wit.ai/speech?v=20160526";
URL url = new URL(requestURL);
HttpURLConnection httpConn = (HttpURLConnection) url.openConnection();
httpConn.setUseCaches(false);
httpConn.setDoOutput(true); // indicates POST method
httpConn.setDoInput(true);
httpConn.setRequestMethod("POST");
httpConn.setRequestProperty("Connection", "Keep-Alive");
httpConn.setRequestProperty("Cache-Control", "no-cache");
httpConn.setRequestProperty("Authorization", "Bearer XXXXXXXXXXXXXXXXXXXXXX");;
httpConn.setRequestProperty("Content-Type", "audio/wav");;
File waveFile= new File("RecordAudio.wav");
byte[] bytes = Files.readAllBytes(waveFile.toPath());
DataOutputStream request = new DataOutputStream(httpConn.getOutputStream());
request.write(bytes);
request.flush();
request.close();
String response = "";
// checks server's status code first
int status = httpConn.getResponseCode();
if (status == HttpURLConnection.HTTP_OK) {
InputStream responseStream = new BufferedInputStream(httpConn.getInputStream());
BufferedReader responseStreamReader
= new BufferedReader(new InputStreamReader(responseStream));
String line = "";
StringBuilder stringBuilder = new StringBuilder();
while ((line = responseStreamReader.readLine()) != null) {
stringBuilder.append(line).append("\n");
}
responseStreamReader.close();
response = stringBuilder.toString();
httpConn.disconnect();
} else {
throw new IOException("Server returned non-OK status: " + status);
}