1

I have tried relentlessly to create a succesfull file upload from my JAVA/Android project to Django/Python backend.

The file I am trying to upload is a wav audio file which is stored on the phone.

I am trying to mix two sets of code.

The Android code I am using is the one taken from: How to upload a WAV file using URLConnection.

public class curlAudioToWatson extends AsyncTask<String, Void, String> {
        String asrJsonString="";
        @Override
        protected String doInBackground(String... params) {
            String result = "";
            try {
                Log.d("Msg","**** 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.setRequestProperty("enctype", "multipart/form-data");
                conn.setRequestMethod("POST");
                conn.setDoInput(true);
                conn.setDoOutput(true);
                String wavpath=mRcordFilePath;
                File wavfile = new File(wavpath);
                boolean success = true;
                if (wavfile.exists()) {
                    Log.d("Msg","**** audio.wav DETECTED: "+wavfile);
                }
                else{
                    Log.d("Msg","**** 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();
                Log.d("Msg","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();
                    Log.d("Msg","***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);
                            Log.d("Msg","*** Result Text: "+asrResult);
                            result = asrResult;
                        }
                    }
                    Log.d("Msg","***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();
                    Log.d("Msg","POST FAILED: " + response.toString());
                    result = "";
                }
            } catch (Exception e) {
                Log.d("Msg","HTTP Exception: " + e.getLocalizedMessage());
            }
            return result; //"Failed to fetch data!";
        }

        @Override
        protected void onPostExecute(String result) {
            if(!result.equals("")){
                Log.d("Msg","onPostEXECUTE SUCCESS, consuming result");

                //sendTextInputFromUser(result);
                //ActionManager.getInstance().addDebugMessage("***ASR RESULT: "+asrJsonString);
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {

                    }
                });
            }else{
                Log.d("Msg","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;
                    Log.d("Msg","UPLOADING: "+progress+" kB");
                }
            }
            os.flush();
            is.close();
            os.close();
        } catch (Exception ex) {
            Log.d("Msg","File to Network Stream Copy error "+ex);
        }
    }

The Django backend code is taken from: https://simpleisbetterthancomplex.com/tutorial/2016/08/01/how-to-upload-files-with-django.html and I am using the simple upload:

def simple_upload(request):
    if request.method == 'POST' and request.FILES['myfile']:
        myfile = request.FILES['myfile']
        fs = FileSystemStorage()
        filename = fs.save(myfile.name, myfile)
        uploaded_file_url = fs.url(filename)
        return render(request, 'core/simple_upload.html', {
            'uploaded_file_url': uploaded_file_url
        })
    return render(request, 'core/simple_upload.html')

I have already disabled the need for CSRF using @csrf_exempt.

I am getting the error "MultiValueDictKeyError" since Java does not post the file with the name 'myfile' for request.FILES['myfile'] to catch. Is have tried removing the ['myfile'] and just use request.FILES but then I get an error on

filename = fs.save(myfile.name, myfile)

saying there is no name to fetch.

Can I post the file so that it it catched by

request.FILES['myfile']

or is there better/simpler Django backend-code to use for communication with Android/IOS.

Thanks in advance and I apologize if this is a stupid question but I am dead stuck.

1 Answer 1

1

Here I go again answering my own question.

I found the following code from Android:How to upload .mp3 file to http server?

Using that instead of How to upload a WAV file using URLConnection and changing the line: dos.writeBytes("Content-Disposition: form-data; name=\"uploadedfile\";filename=\"" + existingFileName + "\"" + lineEnd);

To dos.writeBytes("Content-Disposition: form-data; name=\"myfile\";filename=\"" + existingFileName + "\"" + lineEnd);

fixed my problem.

Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.