我正在尝试将我的Android应用程序中的.wav文件发送到Django服务器。主要问题是在服务器端经常出现此错误: wave.Error:文件不以RIFF id开头
从客户端的角度来看,这是我将 test_audio.wav 文件转换为 byte []
的方式HashMap<String, String> postParams = new HashMap<>();
InputStream inStream = testPronunciationView.getContext().getResources().openRawResource(R.raw.test_audio);
ByteArrayOutputStream out = new ByteArrayOutputStream();
BufferedInputStream in = new BufferedInputStream(inStream);
int read;
byte[] buff = new byte[1024];
while ((read = in.read(buff)) > 0) {
out.write(buff, 0, read);
}
out.flush();
byte[] fileAudioByte = out.toByteArray();
// two options to transform in a string
// 1st option
String decoded = new String(fileAudioByte, "UTF-8");
// 2nd option
String decoded = toJSON(fileAudioByte);
// decoded = either one of above
postDataParams.put("Audio", decoded)
// ....
// prepare a POST request here to send to the server
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setReadTimeout(15000);
conn.setConnectTimeout(15000);
conn.setRequestMethod("POST");
conn.setDoInput(true);
conn.setDoOutput(true);
OutputStream os = conn.getOutputStream();
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(os, "UTF-8"));
writer.write(getPostDataString(postDataParams));
writer.flush();
writer.close();
os.close();
编辑:创建JSON字符串的方法:
public static String toJSON(Object object) throws JSONException, IllegalAccessException
{
String str = "";
Class c = object.getClass();
JSONObject jsonObject = new JSONObject();
for (Field field : c.getDeclaredFields()) {
field.setAccessible(true);
String name = field.getName();
String value = String.valueOf(field.get(object));
jsonObject.put(name, value);
}
System.out.println(jsonObject.toString());
return jsonObject.toString();
}
在服务器端我做:
audiofile_string = data['FileAudio']
audiofile_byte = list(bytearray(audiofile_string, 'utf8'))
temp_audiofile = tempfile.NamedTemporaryFile(suffix='.wav')
with open(temp_audiofile.name, 'wb') as output:
output.write(''.join(str(v) for v in audiofile_byte))
# The following line throws the error
f = wave.open(temp_audiofile.name, 'r') # wave.py library
所以我认为我在转换或后调用中做错了。有什么建议吗?感谢
答案 0 :(得分:0)
您是否有使用JSON尝试执行此操作的具体原因?您不能只将二进制数据填充到JSON字符串中。
如果您可以避免使用JSON,那么只需使用multipart / form-data请求通过HTTP发布二进制数据。
如果由于某种原因您仍然坚持使用JSON,则可以使用base64编码来实现此目的。在Android应用中,您需要对二进制数据进行base64编码。这将产生一个字符串。然后,您可以将JSON中的此字符串发送到服务器。在服务器端,您需要从JSON,base64解码中获取此base64编码的字符串,然后将其保存到文件(或者您想要对二进制数据执行的任何操作)。这是一些小例子。
客户方:
int read;
byte[] buff = new byte[1024];
while ((read = in.read(buff)) > 0) {
out.write(buff, 0, read);
}
out.flush();
byte[] fileAudioByte = out.toByteArray();
String encodedString = Base64.encodeToString(fileAudioByte, Base64.DEFAULT);
encodedString
是String
,然后您将添加到您的JSON以发送到服务器。
服务器端:
import base64
...
audiofile_string = data['FileAudio']
audiofile_byte= base64.b64decode(audiofile_string)
# audiofile_byte now contains the bytes of the audio file, proceed to write to disk