"缺少文件"错误在使用HTTP上传后的文件服务器
我想从我的Android设备上的文件上传到服务器。我使用的是低于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.