Android:上传到服务器的图像始终为 0 字节

Posted

技术标签:

【中文标题】Android:上传到服务器的图像始终为 0 字节【英文标题】:Android : Image uploaded to server is always 0 bytes 【发布时间】:2015-10-19 02:13:20 【问题描述】:

我正在尝试将表单数据连同图像一起上传(发布)到服务器。我尝试了以下代码,但无法查明错误。

Android 代码:

我正在主活动中创建一个 Product 类的对象并将其发送到后台活动。我正在尝试将数据上传到服务器的位置。

使用的步骤:

    从图库中浏览图片并显示在图片视图中。 在点击主活动中的“上传”按钮时,会转换 图像到位图并将其设置在 Product 类的对象中 启动了后台活动并通过了产品引用 在第 2 步中创建 从产品对象中获取位图,将其转换为字节 数组.. 然后使用 Base64 转换为字符串。 将数据发布到服务器。
protected String doInBackground(Products... params) 
    Products pd=params[0];
    Bitmap bmp=pd.getImage();
    ByteArrayOutputStream bos = new ByteArrayOutputStream();
    Log.e("Bitmap ","height : "+bmp.getHeight()+" Width :"+bmp.getWidth());
    Log.e("Size of bmp",""+bmp.getByteCount());
    bmp.compress(Bitmap.CompressFormat.JPEG,100,bos);
    Log.e("Size of bos",""+bos.size());
    byte[] imageToByte = bos.toByteArray();
    String imageData = Base64.encodeToString(imageToByte,Base64.DEFAULT);
    Log.e("Base64 encoded image",imageData);

    Log.e("Status","Image Parsed");

    try
        String link="*****/sellPage.php";

        String data = URLEncoder.encode("uploadedimage", "UTF-8") + "=" + imageData;
        Log.e("Image Data",data);
        URL url = new URL(link);
        URLConnection conn = url.openConnection();

        conn.setDoOutput(true);
        OutputStreamWriter wr = new OutputStreamWriter(conn.getOutputStream());

        wr.write(data);
        wr.flush();
        Log.e("Status", "Request Sent");
        BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream()));

        StringBuilder sb = new StringBuilder();
        String line = null;

        // Read Server Response
        while ((line = reader.readLine()) != null) 
            sb.append(line);
            break;
        
        Log.e("Status","Response forwarded for processing");
        return sb.toString();
    
    catch (MalformedURLException e) 
        e.printStackTrace();
    
    catch(UnsupportedEncodingException e) 
        e.printStackTrace();
    
    catch (IOException e)
        e.printStackTrace();
    

    return null;

从安卓读取数据并写入文件的 PHP 代码

$imgsrc = base64_decode($_POST['uploadedimage']); 

echo $imsrc;

$fp = fopen('myImage1.jpg', 'w');

fwrite($fp, $imgsrc);

if(fclose($fp)) echo "Successful";

else echo "Error uploading image";

输出

文件正在服务器上创建,但文件大小仅为 0 字节。一两次文件只有几百 KB,但是当我尝试在“img”标签中显示它时没有输出。

任何帮助将不胜感激。

【问题讨论】:

不要将“文件”视为 POST。 php.net/manual/en/reserved.variables.files.php 您好 Fred,感谢您的快速回复。那么我应该将文件作为 MultipartEntity 发送,然后使用 $_FILES 将其保存在服务器端吗? 不客气。完全正确。 所以尝试使用$_FILES['uploadedimage'] 而不是$_POST['uploadedimage'],但我无法在android 方面提供帮助。 @HarshBafna 在您的打开 PHP 标记(例如 <?php error_reporting(E_ALL); ini_set('display_errors', 1);)之后将错误报告添加到文件顶部,然后是其余代码,以查看它是否产生任何结果。 @Fred-ii:是的,我正在尝试该方法(MultipartEntity)...需要更改代码...目前我将图像数据作为字符串(Base 64 编码)而不是作为文件,因此 $_FILES 无法使用此代码。我只是想知道这种方法的错误。 【参考方案1】:

您可以将以下代码与您的代码一起用于将图像发送到后端

mEntity = new MultipartEntity();
    if (byteArray != null || bitmap != null) 
     mEntity.addPart("profile_pic", new ByteArrayBody(byteArray,
       "image/jpg", "" + etName.getText().toString()
       + "_profile_pic.jpg"));

对于后端,您可以获得$_FILES['profile_pic'] 的图像。您将获得图像以及与图像相关的所有详细信息。

【讨论】:

以上是关于Android:上传到服务器的图像始终为 0 字节的主要内容,如果未能解决你的问题,请参考以下文章

将图像上传到服务器android

Android到servlet图像上传保存在服务器上

位图始终在相机意图中返回null

在android中将图像作为BLOB上传到SQL

从图库中选择的 Android 图像方向始终为 0:Exif TAG

以字节数组上传到服务器的映像损坏(无法打开图像)