照片存储

本文介绍了一种从数据库中获取用户头像并将其转换为Base64字符串的方法。通过使用Java的BLOB处理和Base64编码技术,可以有效地将数据库中的图片资源转化为可在前端显示的Base64格式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

String base64Str = null;
   if ((currentUser.getPhotoid() != null)
     && (!currentUser.getPhotoid().trim().equals(""))) {
    TUmPhoto tumPhoto = (TUmPhoto) this.dao.getObject(
      TUmPhoto.class, currentUser.getPhotoid());
    byte[] currentPhoto = null;
    if ((tumPhoto != null)
      && (!"".equals(tumPhoto.getPid().trim()))) {
     try {
      SerializableBlob blob = (SerializableBlob) tumPhoto
        .getUserphoto();
      BLOB blob2 = (BLOB) blob.getWrappedBlob();
      currentPhoto = blob2.getLocator();
     } catch (Exception e) {
      e.printStackTrace();
     }
     base64Str = new sun.misc.BASE64Encoder()
       .encode(currentPhoto);
    }
   }
   targetRequest.setPhoto(base64Str);
<think>我们正在讨论如何测试照片存储功能,特别是拍摄照片后的存储功能。根据用户提供的引用,我们可以总结出几个关键点: 1. 照片存储有两种:物理存储(保存到设备存储)和数据库信息存储(用于后续上传等)。 2. 拍摄照片时,我们需要指定存储路径,并且要注意避免因图片过大导致OOM(引用[3])。 3. 有些设备(如三星)拍摄的照片可能会存在旋转问题(引用[4]),需要处理。 因此,测试照片存储功能应该包括以下几个方面: ### 一、测试物理存储功能 1. **存储路径正确性**: - 检查照片是否成功保存到指定的目录。 - 检查保存的文件名是否符合预期(如按照时间戳命名)。 - 验证保存的图片文件是否可读,且内容正确(即拍摄的照片内容与保存的一致)。 2. **文件格式和大小**: - 检查保存的图片格式是否正确(如JPEG)。 - 检查图片大小是否在合理范围内(避免过大导致OOM,或者过小导致质量差)。 3. **存储权限**: - 测试在无存储权限的情况下,应用是否能够正确处理(如请求权限或提示用户)。 4. **存储空间不足**: - 模拟存储空间不足的情况,检查应用是否能够正确处理(如提示用户)。 ### 二、测试数据库信息存储(如果涉及) 1. **数据库记录正确性**: - 拍摄照片后,检查数据库中的照片表(Photo)是否新增了一条记录。 - 检查记录中的字段是否正确:如照片URL(应该指向物理存储的位置)、拍摄时间、位置(如果有)等。 - 检查用户与照片的关系表(UserPhotoRelation)是否记录了用户和照片的关联关系。 2. **数据一致性**: - 当物理存储照片被删除时,数据库中的记录是否相应处理(取决于设计,可能是级联删除,或者标记删除)。 ###三、测试边界和异常情况 1. **多次连续拍摄**: - 测试连续拍摄多张照片,检查是否都能正确存储,且命名不冲突。 2. **不同拍摄模式**: - 测试使用系统相机拍摄(返回数据方式)和指定存储路径方式(避免OOM的方式)的存储情况。 3. **设备兼容性**: - 测试在不同设备上(特别是三星设备,引用[4]提到的旋转问题)拍摄的照片存储后是否方向正确,内容是否正常。 4. **中断测试**: - 在拍摄过程中中断(如电话接入、低电量关机等),检查是否产生垃圾文件或存储状态是否一致。 ###四、自动化测试建议 可以编写自动化测试脚本,模拟拍照和存储过程,然后验证存储结果。以下是一个简单的示例(使用Android Instrumentation Test): ```java @RunWith(AndroidJUnit4.class) public class CameraStorageTest { @Rule public GrantPermissionRule grantPermissionRule = GrantPermissionRule.grant(Manifest.permission.WRITE_EXTERNAL_STORAGE); @Test public void testPhotoStorage() { // 启动相机Activity Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); File photoFile = createImageFile(); // 创建临时文件 intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(photoFile)); ActivityScenario<CameraActivity> scenario = ActivityScenario.launch(CameraActivity.class); // 模拟拍照(假设有一个按钮执行拍照操作) onView(withId(R.id.btn_capture)).perform(click()); // 等待存储完成 try { Thread.sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } // 检查文件是否存在 assertTrue(photoFile.exists()); // 检查文件大小(至少大于0) assertTrue(photoFile.length() > 0); // 检查图片方向(如果需要,可以使用ExifInterface检查旋转信息) ExifInterface exif = new ExifInterface(photoFile.getAbsolutePath()); int orientation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL); // 验证方向是否正确,例如没有旋转应该是ORIENTATION_NORMAL assertEquals(ExifInterface.ORIENTATION_NORMAL, orientation); // 清理测试文件 photoFile.delete(); } private File createImageFile() throws IOException { String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date()); String imageFileName = "TEST_" + timeStamp; File storageDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES); return File.createTempFile(imageFileName, ".jpg", storageDir); } } ``` ###五、相关问题 根据以上内容,生成相关问题: 1. 如何测试照片存储时的权限处理? 2. 照片存储后如何验证其内容正确性(比如图像质量)? 3. 如何模拟存储空间不足的情况进行测试? 4. 数据库存储照片信息时,如何测试数据一致性? 5. 如何测试不同设备上拍摄照片存储兼容性(如旋转问题)? 注意:在回答中引用了用户提供的引用,我们在适当的地方标注引用标识。</think>### 测试照片存储功能的完整方案 #### **一、基础存储路径测试** 1. **默认存储路径验证** - 检查照片是否成功保存到系统默认目录(如 `DCIM/Camera/`) - 验证文件名格式是否符合规范(例:`yyyyMMddHHmmss.jpg`)[^4] ```java // 检查文件是否存在示例 File file = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM), "Camera/test_202305201200.jpg"); assertTrue("文件未创建", file.exists()); ``` 2. **自定义路径测试** - 测试指定自定义目录的存储功能(如 `AppName/Photos/`) - 验证路径权限处理:当目录不可写时是否触发异常处理 ```java // 自定义路径有效性检查 File customDir = new File("/sdcard/AppName/Photos/"); if (!customDir.canWrite()) { fail("目录无写入权限"); } ``` --- #### **二、存储内容完整性测试** 1. **文件基础属性验证** | 测试项 | 验证方法 | 合格标准 | |----------------|------------------------------|-------------------| | 文件大小 | `file.length() > 0` | > 50KB (典型值) | | 文件格式 | 检查文件头魔数 | JPEG: `FF D8 FF` | | 可读性 | `BitmapFactory.decodeFile()` | 不返回`null` | 2. **图像内容校验** - 拍摄后立即读取并比对关键特征: ```java Bitmap orig = takePhoto(); // 拍摄获取Bitmap Bitmap saved = BitmapFactory.decodeFile(filePath); assertTrue("图像内容不一致", orig.sameAs(saved)); ``` --- #### **三、异常场景测试** 1. **存储空间不足** - 模拟磁盘满状态(使用 `dd` 命令填充存储) - 验证行为: - 应抛出 `IOException` - 需提供用户友好提示(如 Toast 提示) 2. **权限异常处理** - 主动拒绝 `WRITE_EXTERNAL_STORAGE` 权限 - 验证: - 是否触发权限请求流程 - 无权限时是否使用应用私有目录降级存储[^3] 3. **设备兼容性问题** - 重点测试三星等厂商设备的方向处理: ```java // 解决三星设备旋转问题[^4] ExifInterface exif = new ExifInterface(filePath); int orientation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, 1); assertNotEquals("方向异常", ExifInterface.ORIENTATION_ROTATE_90, orientation); ``` --- #### **四、数据库关联测试** 1. **数据库写入验证** - 检查照片元数据是否写入数据库表[^2]: ```sql SELECT * FROM Photo WHERE photo_url = '/path/to/image.jpg'; ``` - 验证字段完整性: | 字段 | 校验规则 | |-------------|-------------------------| | `photo_url` | 与物理路径完全匹配 | | `timestamp` | 与拍摄时间误差 < 2s | | `user_id` | 外键关联用户表有效性[^2]| 2. **事务一致性测试** - 模拟写入数据库时断电/崩溃 - 验证:存储事务应满足 ACID 特性,确保数据不出现半写入状态 --- #### **五、自动化测试方案** ```java // AndroidJUnit 测试用例示例 @RunWith(AndroidJUnit4.class) public class PhotoStorageTest { @Rule public GrantPermissionRule permissionRule = GrantPermissionRule.grant(Manifest.permission.WRITE_EXTERNAL_STORAGE); @Test public void testStorageFlow() { // 启动相机 Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); File photoFile = createTempFile(); // 创建临时文件 intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(photoFile)); // 执行拍摄 InstrumentationRegistry.getInstrumentation().startActivitySync(intent); // 验证存储 assertTrue(photoFile.exists()); assertTrue(photoFile.length() > 1024 * 50); // >50KB // 验证数据库 PhotoDbHelper db = new PhotoDbHelper(context); PhotoRecord record = db.queryByPath(photoFile.getAbsolutePath()); assertNotNull(record); } } ``` --- ### **测试报告关键指标** | 指标 | 合格标准 | 测量工具 | |--------------------|-----------------------|-------------------| | 存储成功率 | ≥99.9% | 自动化测试脚本 | | 存储延迟 | <500ms | Systrace | | 异常恢复率 | 100% | 模拟异常注入 | | 跨设备兼容性 | 通过主流厂商测试 | 云测试平台 |
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值