打开失败:ENOENT(没有这个文件或目录)错误。

7

我在使用亚马逊 S3 Android 库上传通过相机拍摄的图片时,遇到了问题。

以下是保存照片的代码:

File _photoFile = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM),   (cal.getTimeInMillis() + ".jpg"));

            try {
                if (_photoFile.exists() == false) {
                    _photoFile.getParentFile().mkdirs();
                    _photoFile.createNewFile();
                }

            } catch (IOException e) {
                // Log.e(TAG, "Could not create file.", e);
            }
            // Log.i(TAG, path);

            filePath = Uri.fromFile(_photoFile);
            Intent cameraIntent = new Intent(
                    android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
            cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, filePath);
            startActivityForResult(cameraIntent, 1);

上传带有文件路径的图片:

try {
            s3Client.createBucket(Constants.getPictureBucket());

            // Content type is determined by file extension.
            PutObjectRequest por = new PutObjectRequest(
                    Constants.getPictureBucket(), Constants.PICTURE_NAME,
                    new java.io.File(filePath));
            s3Client.putObject(por);
        } catch (Exception exception) {

            result.setErrorMessage(exception.getMessage());
        }

我一直在遇到错误:无法计算MD5哈希值:/file:/storage/sdcard0/DCIM/13161272646580.jpg打开失败:ENOENT(文件或目录不存在),但是当我浏览我的sd卡目录时,我可以找到那张图片(图片已经创建),而且我已经设置了相关权限。

你有没有找到解决方案? - just_user
我也遇到了同样的问题。你知道解决方法吗? - Sakthimuthiah
这里也是,有解决方案吗?@just_user? - osayilgan
@osayilgan,请检查我的答案,希望它对你有用! - just_user
2个回答

2
问题出在你的文件路径上。使用类似下面这样的方法获取真实路径。
我给你提供一个例子,如果你从onActivityResult()获取图片 你应该有一个onActivityResult(int requestCode, int resultCode, Intent data)函数,在这个函数中你可以获得图片的Uri。
Uri uri = data.getData();
然后使用它并从Uri中获取真实路径,将其传递给PutObjectRequest(BUCKET_NAME, IMAGE_NAME, REAL_PATH)。
public String getRealPathFromURI(Context context, Uri contentUri) {
    Cursor cursor = null;
    try {
        String[] proj = { MediaStore.Images.Media.DATA };
        cursor = context.getContentResolver().query(contentUri,  proj, null, null, null);
        int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
        cursor.moveToFirst();
        return cursor.getString(column_index);
    } finally {
        if (cursor != null) {
            cursor.close();
        }
    }
}

我曾遇到同样的问题,我通过以下方法解决了它。希望能帮到你!


1

我不太记得我做了什么。但这是我使用的代码,它可以正常工作。希望它能帮到你们!

AmazonS3Client s3Client = new AmazonS3Client(new BasicAWSCredentials("XXX", "XXX"));
String time = "" + System.currentTimeMillis();
PutObjectRequest por = new PutObjectRequest("fraternity", xyz_url_xyz + "/avatar" + time + ".jpg", new java.io.File(params[0]));
por.setCannedAcl(CannedAccessControlList.PublicRead);
s3Client.putObject(por);
ResponseHeaderOverrides override = new ResponseHeaderOverrides();
override.setContentType("image/jpeg");
GeneratePresignedUrlRequest urlRequest = new GeneratePresignedUrlRequest("xyz_url_xyz/avatar.jpg");
urlRequest.setExpiration(new Date(System.currentTimeMillis() + 3600000));  
urlRequest.setResponseHeaders( override );
s3Client.generatePresignedUrl(urlRequest);

1
问题出在文件系统上。我正在使用Transfer Manager上传文件,这使得代码更简洁。但还是感谢您的回复。 - osayilgan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接