"缺少文件"错误在使用HTTP上传后的文件服务器

问题描述:

我想从我的Andr​​oid设备上的文件上传到服务器。我使用的是低于code为:

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
}

问题是我得到一个 HTTP / 1.1 400错误的请求和for坏请求的原因是缺少文件。这里是我的logcat输出:

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."}

你可以从上面的文件是否存在输出中看到的,但我不知道为什么我不能把它上传到我的服务器。
另外,服务器和网址,工作,我已经使用谷歌Chrome浏览器的高级REST客户端的应用程序已经测试了它绝对的罚款。这里是一个截图。

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.

只是一个除了我的问题,我自己也尝试下面​​的code我在很多previous找到答案,

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();
        }

不过,上述code坠毁我有FileNotFoundException异常

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.

在此先感谢!

很多的奋斗,我终于解决了我的问题。答案是的文件上传的第二种方式,我用Apache库的修改。这里是code为我工作:

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();
        }

我在我的问题code获得唯一的例外是

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"));

而不是只此

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");

我还是一直无法弄清楚,为什么我的第一个code没有工作,为什么却显示出文件丢失的错误。任何有关更多的答案仍然是AP preciated。

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.