Why I get java.io.FileNotFoundException in getting the response to my httpUrlConnection?

2k Views Asked by At

I don't know if Im sending my file right to web api. Because nothing gives an error to client request code. But when I'm getting the response to the server it gives me a java.io.FileNotFoundException. So I think that there's wrong in my request code because it doesn't upload any file to the web server and I think that's why I get The java.io.FileNotFoundException. Please help me to this thanks.

    HttpURLConnection conn = null;
    DataOutputStream dos = null;

    String samplefile = "storage/sdcard0/Pictures/Images/productshot.jpg";
    String urlString = "http://avasd.server.com.ph:1217/api/fileupload";    

        File mFile = new File(samplefile);

        int mychunkSize = 2048 * 1024;
        final long size = mFile.length();
        final long chunks = size < mychunkSize? 1: (mFile.length() / mychunkSize);

        int chunkId = 0;


        int bytesRead, bytesAvailable, bufferSize;

        byte[] buffer;

        int maxBufferSize = 2 * 1024 * 1024;
        try {
            //Client Request

            FileInputStream stream = new FileInputStream(mFile);

            String lineEnd = "\r\n";
            String twoHyphens = "--";
            String boundary =  "-------------------------acebdf13572468";// random data

            String param1 = ""+chunkId;
             String param2 = ""+chunks;
             String param3 = mFile.getName();
             String param4 = samplefile;

            for (chunkId = 0; chunkId < chunks; chunkId++) {

                 URL url = new URL(urlString);

                 // Open a HTTP connection to the URL
                 conn = (HttpURLConnection) url.openConnection();

                 conn.setReadTimeout(20000 /* milliseconds */);
                 conn.setConnectTimeout(20000 /* milliseconds */);


                 // Allow Inputs
                 conn.setDoInput(true);
                 // Allow Outputs
                 conn.setDoOutput(true);
                 // Don't use a cached copy.
                 conn.setUseCaches(false);
                 // Use a post method.
                 conn.setRequestMethod("POST");


                 String encoded = Base64.encodeToString((_username+":"+_password).getBytes(),Base64.NO_WRAP); 
                 conn.setRequestProperty("Authorization", "Basic "+encoded); 
                 conn.setRequestProperty("Connection", "Keep-Alive");
                 conn.setChunkedStreamingMode(0);
                 conn.setRequestProperty("Content-Type", "multipart/form-data;boundary="+boundary);
                 int length = (int) (param2.length() + param3.length() + mFile.length() + encoded.length() + lineEnd.length() + twoHyphens.length() + boundary.length());   
                 conn.connect();
                 dos = new DataOutputStream( conn.getOutputStream() );
                 dos.writeBytes(twoHyphens + boundary + lineEnd);


                // Send parameter #file
                dos.writeBytes("Content-Disposition: form-data; name=\"fieldNameHere\";filename=\"" + mFile.getName() + "\"" + lineEnd); // filename is the Name of the File to be uploaded
                dos.writeBytes("Content-Type: image/jpeg" + lineEnd);
                dos.writeBytes(lineEnd);


                // Send parameter #chunks
                dos.writeBytes("Content-Disposition: form-data; name=\"chunk\"" + lineEnd);
                dos.writeBytes(param2 + lineEnd);
                dos.writeBytes(twoHyphens + boundary + lineEnd);


                // Send parameter #name
                dos.writeBytes("Content-Disposition: form-data; name=\"name\"" + lineEnd);
                dos.writeBytes(param3 + lineEnd);
                dos.writeBytes(twoHyphens + boundary + lineEnd);


                bytesAvailable = stream.available();
                bufferSize = Math.min(bytesAvailable, maxBufferSize);
                buffer = new byte[bufferSize];
                // read file and write it into form...
                bytesRead = stream.read(buffer, 0, bufferSize);


                while (bytesRead > 0) {
                    dos.write(buffer, 0, bufferSize);
                    bytesAvailable = stream.available();
                    bufferSize = Math.min(bytesAvailable, maxBufferSize);
                    bytesRead = stream.read(buffer, 0, bufferSize);
                    Log.i("BytesAvailable", String.valueOf(bytesAvailable));
                    Log.i("bufferSize", String.valueOf(bufferSize));
                    Log.i("Bytes Read", String.valueOf(bytesRead));
                    Log.i("buffer", String.valueOf(buffer));
                }
                // send multipart form data necesssary after file data...

                dos.writeBytes(lineEnd);
                dos.writeBytes(twoHyphens + boundary + twoHyphens + lineEnd);
                // close streams

                stream.close();
                dos.flush();
                dos.close();
                Log.i("DOS: ", String.valueOf(dos.size()));


            }

        } catch (MalformedURLException ex) {
            System.out.println("From CLIENT REQUEST:" + ex);
        }catch (IOException ioe) {
            System.out.println("From CLIENT REQUEST:" + ioe);
        }catch (Exception e) {
            Log.e("From CLIENT REQUEST:", e.toString());
        }


        //Server Response
        try {
            System.out.println("Server response is: \n");
            DataInputStream inStream = new DataInputStream(conn.getInputStream());
            String str;
            while ((str = inStream.readLine()) != null) {
            System.out.println(str);
            System.out.println("");
            }
            inStream.close();
            System.out.println("\nEND Server response ");

            } catch (IOException ioex) {
            System.out.println("From (ServerResponse): " + ioex);

            }
2

There are 2 best solutions below

0
On

check permission in your manifest.xml you should add permission to access sdcard0 memory location : try this

5
On

I think before you write data into file, you must make sure that the File variable's parent is available.You can see code below:

/**
 * 
 * @param path
 *            like '/abc/temp' which will retutn '/mnt/sdcard/abc/temp'
 * @return
 */
public static File getFile(String path) {
    File file = new File(Environment.getExternalStorageDirectory() + path);
    File parent = file.getParentFile();
    if (!parent.exists()) {
        parent.mkdirs();
    }
    if (!file.exists()) {
        try {
            file.createNewFile();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
    return file;
}

This is a function which I often use.Hope it will help.