“Missing file” error while uploading file to serve

2019-07-22 10:35发布

问题:

I want to upload a file from my android device to a server. I am using the below code for that:

File file = new File("/sdcard/Pictures/","wallpaper.png");        
try {
    Log.i("fileupload","checking file exists="+file.exists());
    Log.i("fileupload","checking file length="+file.length());
    HttpClient httpclient = new DefaultHttpClient();
    HttpPost httppost = new HttpPost(url);
    InputStreamEntity reqEntity = new InputStreamEntity(new FileInputStream(file), file.length());        
    reqEntity.setContentType("binary/octet-stream");
    httppost.addHeader("Content-Type", "multipart/form-data");
    reqEntity.setChunked(true);
    httppost.setEntity(reqEntity);
    Log.i("Point1=","We are here");
    HttpResponse response = httpclient.execute(httppost);
    Log.i("Point2=","We are here");
    Log.i("response=",""+response.getStatusLine());
    BufferedReader bufferreader = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));
    String msg="";
    String line = "";
    while ((line = bufferreader.readLine()) != null) {
        msg += line;
    }
    Log.i("msg=",""+msg);
                    //Do something with response...
    if(response != null) {
        Toast.makeText(getBaseContext(),  "Upload Completed. ", Toast.LENGTH_SHORT).show();

    } else { // Error, no response.
        Toast.makeText(getBaseContext(),  "Server Error. ", Toast.LENGTH_SHORT).show();
    }
} catch (Exception e) {
                    // show error
}

The problem is I am getting a HTTP/1.1 400 Bad Request and the reason for that bad request is Missing File. Here is my logcat output:

04-09 13:56:06.870      785-866/com.tutsplus.nfcdemo I/fileupload﹕ checking file exists=true
04-09 13:56:06.870      785-866/com.tutsplus.nfcdemo I/fileupload﹕ checking file length=422334
04-09 13:56:06.872      785-866/com.tutsplus.nfcdemo I/Point1=﹕ We are here
04-09 13:56:10.068      785-866/com.tutsplus.nfcdemo I/Point2=﹕ We are here
04-09 13:56:10.068      785-866/com.tutsplus.nfcdemo I/response=﹕ HTTP/1.1 400 Bad Request
04-09 13:56:10.252      785-866/com.tutsplus.nfcdemo I/msg=﹕ {"error":2003,"message":"Missing file."}

As you can see from above output that the file exists, but I don't know why can't I upload it to my server. Also the server and url is working absolutely fine as I have already tested it using Google Chrome's "Advanced REST client" app. Here is a screenshot of that.

Just an addition to my question, I have also tried the below code I found in many previous answers,

InputStream inputStream;
try{
    inputStream = new FileInputStream(new File("/sdcard/Pictures/"));
    byte[] data;
    try{
        data = IOUtils.toByteArray(inputStream);
        Log.d("File size", ""+ data.toString());
        MultipartEntityBuilder entityBuilder =   entityBuilder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE);

        InputStreamBody inputStreamBody = new InputStreamBody(new ByteArrayInputStream(data),"wallpaper.png")
        entityBuilder.addPart("File",inputStreamBody);
        HttpClient httpClient = new DefaultHttpClient();
        String url="my url";
        HttpPost httpPost = new HttpPost(url);
        HttpEntity entity = entityBuilder.build();
        httpPost.setEntity(entity);
        HttpResponse httpResponse = httpClient.execute(httpPost);
        BufferedReader bufferreader = new BufferedReader(new InputStreamReader(httpResponse.getEntity().getContent()));
        String msg="";
        String line = "";
        while ((line = bufferreader.readLine()) != null) {
            msg += line;
        }
        Log.i("msg=",""+msg);

        // Handle response back from script.
        if(httpResponse != null) {
            Toast.makeText(getBaseContext(),  "Upload Completed. ", Toast.LENGTH_SHORT).show();

        } else { // Error, no response.
            Toast.makeText(getBaseContext(),  "Server Error. ", Toast.LENGTH_SHORT).show();
        }
        } catch (IOException e) {
                e.printStackTrace();
        }
        } catch (FileNotFoundException e1) {
            e1.printStackTrace();
        }

But, the above code crashed for me with FileNotFoundException

04-09 16:45:32.876    7694-7750/com.tutsplus.nfcdemo W/System.err﹕ java.io.FileNotFoundException: /sdcard/Pictures: open failed: EISDIR (Is a directory)
04-09 16:45:32.877    7694-7750/com.tutsplus.nfcdemo W/System.err﹕ at libcore.io.IoBridge.open(IoBridge.java:456)

Someone Please help me find my error.

Thanks in advance!

回答1:

After lot of struggle, I finally solved my problem. The answer is a modification of the second way of file upload where I was using apache libraries. Here is the code that worked for me:

InputStream inputStream;
try{
    inputStream = new FileInputStream(new File("/sdcard/Pictures/","wallpaper.png"));
    byte[] data;
    try{
        data = IOUtils.toByteArray(inputStream);
        Log.d("File size", ""+ data.toString());
        MultipartEntityBuilder entityBuilder =   entityBuilder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE);

        InputStreamBody inputStreamBody = new InputStreamBody(new ByteArrayInputStream(data),"wallpaper.png")
        entityBuilder.addPart("File",inputStreamBody);
        HttpClient httpClient = new DefaultHttpClient();
        String url="my url";
        HttpPost httpPost = new HttpPost(url);
        HttpEntity entity = entityBuilder.build();
        httpPost.setEntity(entity);
        HttpResponse httpResponse = httpClient.execute(httpPost);
        BufferedReader bufferreader = new BufferedReader(new InputStreamReader(httpResponse.getEntity().getContent()));
        String msg="";
        String line = "";
        while ((line = bufferreader.readLine()) != null) {
            msg += line;
        }
        Log.i("msg=",""+msg);

        // Handle response back from script.
        if(httpResponse != null) {
            showToast("Upload Completed");

        } else { // Error, no response.
            showToast("Server Error");
        }
        } catch (IOException e) {
                e.printStackTrace();
        }
        } catch (FileNotFoundException e1) {
            e1.printStackTrace();
        }

The exception I was getting in my question code was

04-09 16:45:32.876    7694-7750/com.tutsplus.nfcdemo W/System.err﹕ java.io.FileNotFoundException: /sdcard/Pictures: open failed: EISDIR (Is a directory)
04-09 16:45:32.877    7694-7750/com.tutsplus.nfcdemo W/System.err﹕ at libcore.io.IoBridge.open(IoBridge.java:456)

I solved it by simply having

inputStream = new FileInputStream(new File("/sdcard/Pictures/","wallpaper.png"));

instead of just this

inputStream = new FileInputStream(new File("/sdcard/Pictures/"));

One more reason why my app crashed was because I had Toast() statement in my async task. To resolve that I simply put this function

    public void showToast(final String toast)
    {
        runOnUiThread(new Runnable() {
            public void run()
            {
                    Toast.makeText(FileUpload.this, toast, Toast.LENGTH_SHORT).show();
            }
        });
    }

and called it wherever I needed to Toast. For example:

showToast("Upload Completed");

I still haven't been able to figure out why my first code didn't work and why was it showing "missing file" error. Any more answer regarding that will still be appreciated.



回答2:

Try This Code:-

String url = "Your image upload url";



        HttpClient client = new DefaultHttpClient();
        client.getParams().setParameter(
                CoreProtocolPNames.PROTOCOL_VERSION, HttpVersion.HTTP_1_1);
        HttpPost postMethod = new HttpPost(url);

        MultipartEntity entity = new MultipartEntity();

        try {


                File file1 = new File("your image path");
                FileBody bin1 = new FileBody(file1, "images/jpeg");

                entity.addPart("images[]", bin1);


            postMethod.setEntity(entity);
            HttpResponse response;
            response = client.execute(postMethod);



            String result = EntityUtils.toString(response.getEntity());

            JSONArray ja = new JSONArray(result);

            // ITERATE THROUGH AND RETRIEVE CLUB FIELDS
            int n = ja.length();
            for (int i = 0; i < n; i++) {
                // GET INDIVIDUAL JSON OBJECT FROM JSON ARRAY
                JSONObject jo = ja.getJSONObject(i);

                // RETRIEVE EACH JSON OBJECT'S FIELDS

            String status = jo.getString("status");


                mImageUrlArrayList1.add(imageurl);

                // Log.e("status",status);

            }

        }

        catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }