【发布时间】:2016-01-22 07:02:54
【问题描述】:
您好,我正在使用 android 。我想将多个捕获的图像保存在一个文件夹中(以编程方式在设备的内部存储中创建)并从文件夹中读取此文件并以多部分形式发送到服务器。我使用以下代码将图像附加到多部分,
for(int i=0;i<Captured_imagePath.size();i++) {
try {
final File file2 = new File(android.os.Environment.getExternalStorageDirectory() + "/MyFolder/" + Captured_imagePath.get(i));
final FileBody fileBody = new FileBody(file2);
entityBuilder.addPart(file2.getName(), fileBody);
entityBuilder.setBoundary(boundary);
} catch (Exception e) {
Log.i(TAG, "Except:: " + e.toString());
}
}
当我在这个循环中只使用一张图片时,它可以正常工作。当多张图片时,会导致以下异常
8594-9144/? W/System.err﹕ java.io.FileNotFoundException: /storage/sdcard0/MyFolder/ 20160123_121858.jpg: open failed: ENOENT (No such file or directory)
01-23 12:19:09.525 8594-9144/? W/System.err﹕ at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
01-23 12:19:09.525 8594-9144/? W/System.err﹕ at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
01-23 12:19:09.525 8594-9144/? W/System.err﹕ at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
01-23 12:19:09.525 8594-9144/? W/System.err﹕ Caused by: libcore.io.ErrnoException: open failed: ENOENT (No such file or directory).
我在清单中添加了权限
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
我完整的多部分上传方法是
public String uploadMultipart(String url,String json ,ArrayList<String> imagePath,ArrayList<String> Captured_imagePath) {
String result="";
File file=null;
String boundary = "-------------" + System.currentTimeMillis();
try
{
HttpClient client = new DefaultHttpClient();
HttpPost post = new HttpPost(url);
MultipartEntityBuilder entityBuilder = MultipartEntityBuilder.create();
entityBuilder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE);
entityBuilder.addTextBody("json", json);
entityBuilder.setBoundary(boundary);
if(imagePath.size()!=0)
{
file = new File(android.os.Environment.getExternalStorageDirectory() + "/MyFolder/" + imagePath.get(0));
entityBuilder.addBinaryBody(file.getName(), file, ContentType.create("image/jpeg"), imagePath.get(0));
entityBuilder.setBoundary(boundary);
}
if(Captured_imagePath.size()!=0)
{
for(int i=0;i<Captured_imagePath.size();i++)
{
try {
final File file2 = new File(android.os.Environment.getExternalStorageDirectory() + "/MyFolder/" + Captured_imagePath.get(i));
final FileBody fileBody = new FileBody(file2);
entityBuilder.addPart(file2.getName(), fileBody);
entityBuilder.setBoundary(boundary);
}catch (Exception e)
{
Log.i(TAG, "Except:: " + e.toString());
}
}
}
HttpEntity entity = entityBuilder.build();
ByteArrayOutputStream bytes = new ByteArrayOutputStream();
entity.writeTo(bytes);
String content = bytes.toString();
// Log.i(TAG,"sending data"+content);
// writeToFile("shanu",content);
post.setEntity(entity);
HttpResponse response = client.execute(post);
HttpEntity httpEntity = response.getEntity();
result = EntityUtils.toString(httpEntity);
Log.i(TAG2, result);
}
catch(Exception e)
{
e.printStackTrace();
}
return result.toString();
我在我的文件夹中手动搜索了这个文件,它存在于同一个文件夹中。那为什么我得到这个文件没有找到异常?我该如何解决这个问题?请帮忙。
【问题讨论】:
-
如何循环加载多个图像?需要他的代码来验证
-
MyFolder/之后似乎有一个空格,即 /storage/sdcard0/MyFolder/20160123_121858.jpg。这是导致问题的原因。 -
@Harry:这里 Captured_imagePath 是图像名称的数组列表,并循环到数组列表大小,并将每个项目附加到循环内的 entityBuilder。这是错误的方法吗??
-
你能发布整个代码吗?如果网络连接是在循环中完成的,并且如果您没有提供等待机制来完成图像上传并继续下一步可能会出错...
-
@Harry:请检查我的新编辑
标签: java android image file multipart