问题描述
我想从我的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.
这篇关于"缺少文件"错误在使用HTTP上传后的文件服务器的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!