PHP 图片上传中途失败。已上传半张图片

PHP Image upload failed in middle. Half image uploaded

如何检测图像是否已全部或部分上传?我遇到了一个奇怪的情况,只上传了一半图片。下图是由用户通过 Web 服务通过 Android 应用程序上传的:

管理门户和Web 服务是使用Yii 框架编写的。是什么导致图像被创建成这样? Android 开发人员发送 base-64 编码的字符串,我按以下方式对其进行解码:

$profilePicture = $data['profilePicture'];
    header('Content-Type: image/png');
    $rnd = sprintf('%04d', rand(0, 9999));
    $fileName = $rnd . '_' . time() . '.png'; // random number + timestamp

    $uploadPath = User::getProfilePicturePath() . $id;

    if (!file_exists($uploadPath) and ! is_dir($uploadPath)) //create a directory only if it does not exist.
        mkdir($uploadPath);

    if (!file_put_contents($uploadPath . DIRECTORY_SEPARATOR . $fileName, base64_decode($profilePicture)))

我怀疑是这个原因,因为 Android 开发人员在文件完全上传之前发送 base-64 编码。还是其他原因?

$profilePicture 等于这样的 64 基本字符串,

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

Android 边码如下,

String imageString = Base64.encodeBytes(byteImage);

这是使用的 class 文件。

http://www.mirthcorp.com/community/issues/secure/attachment/10313/Base64.java

public String BitMapToString(Bitmap bitmap){

        ByteArrayOutputStream baos=new  ByteArrayOutputStream();

        bitmap.compress(Bitmap.CompressFormat.JPEG,100, baos);

        byte [] b=baos.toByteArray();

        String temp=null;

        try{

            System.gc();

            temp= Base64.encodeToString(b, Base64.DEFAULT);

        }catch(Exception e){

            e.printStackTrace();

        }catch(OutOfMemoryError e){

            baos=new  ByteArrayOutputStream();

            bitmap.compress(Bitmap.CompressFormat.JPEG,50, baos);
            b=baos.toByteArray();

            temp=Base64.encodeToString(b, Base64.DEFAULT);

            Log.e("EWN", "Out of memory error catched");

        }

        return temp;

    }

此方法可帮助您将位图图像转换为 Base64 编码字符串。

可以使用imagecreatefrompng函数来检查提供的图片是否损坏。

$src1 = 'F:\Test74_1423730003.png';
$src2 = 'F:\Test30_1423722865.png'; // broken

$im = @imagecreatefrompng($src1);
if ($im)
    echo 'created img';
else
    echo 'not created, broken image';