通过http上传时Android图像损坏

2024-01-12

当我将图像从 Android 设备(v 2.2)上传到服务器(带有 php 的 apache)时 基本上,有与这里相同的问题:Android开发图片上传损坏 https://stackoverflow.com/questions/3154224/android-development-image-upload-corrupted

起初,上传方法是基于apache httpcomponent 4.1,我认为问题出在其中。然后我基于HttpURLConnection编写了自己的上传库。

我尝试使用不同的服务器,但仍然是一样的。

Example:
http://pixelbirthcloud.com/corrupted_images/1_orig.jpg http://pixelbirthcloud.com/corrupted_images/1_orig.jpg- 原始图像
http://pixelbirthcloud.com/corrupted_images/1_corrupted.jpg http://pixelbirthcloud.com/corrupted_images/1_corrupted.jpg- 我们在服务器上得到的内容。

文件大小相同,但内容中的内容存在损坏的字节块:

00051330 |       49 69 11 4B 9D E6 | 00051330 |       DA BB 10 70 DC 77 |  
00051338 | 2D B9 1B B9 E4 81 5A E6 | 00051338 | AC 20 C7 90 7E B4 33 80 |  
00051340 | D4 14 B0 F4 EA 3D D1 E9 | 00051340 | 31 9A B8 C2 29 83 66 9C |  
00051348 | 61 9D E3 38 F7 36 DE 63 | 00051348 | 9A 84 8E 73 9A 8D B5 29 |  
00051350 | 25 9D 9D C4 64 C3 23 AA | 00051350 | 18 60 1C 0F 7A CF 33 01 |  
00051358 | 4A EB 08 C3 97 7C 8C 36 | 00051358 | D4 F0 7A D3 24 BA 85 71 |  
00051360 | 73 F5 E3 15 14 5B BC C1 | 00051360 | F3 0A 76 8A D6 C4 36 5E |  
00051368 | B9 A4 49 06 71 1B 11 87 | 00051368 | 7B B9 5F 20 E3 A5 46 F2 |  
00051370 | 39 E7 76 7B 8F 5F       | 00051370 | B8 1D 4E 6B 36 6D       |

我不知道这取决于什么,但在我客户的设备上,图像的损坏程度要高得多。有时上传正常,但大多数时候上传的图像已损坏。

所以我猜这与http传输无关。这是关于将流从 SD 卡获取到内存,然后将该流保存到 http...

代码如下。

你们有什么想法吗?尝试了一切,但仍然不起作用。

public String execute() throws IOException {
    String lineEnd = "\r\n";
    String twoHyphens = "--";
    String boundary = "*****MultipartBoundary";

    try {
        URL url = new URL(mUri);
        HttpURLConnection conn = (HttpURLConnection) url.openConnection();

        conn.setDoInput(true);
        conn.setDoOutput(true);
        conn.setUseCaches(false);
        conn.setRequestMethod("POST");
        conn.setRequestProperty("Connection", "Keep-Alive");
        conn.setRequestProperty("Content-Type",
                "multipart/form-data; boundary=" + boundary);

        // timeouts
        conn.setConnectTimeout(CONNECT_TIMEOUT);
        conn.setReadTimeout(READ_TIMEOUT);

        Log.d(TAG, "Opening connectionStream");
        DataOutputStream dos = new DataOutputStream(conn.getOutputStream());

        Log.d(TAG, "Adding params");
        for (NameValuePair param : mParams) {
            dos.writeBytes(twoHyphens + boundary + lineEnd);
            dos.writeBytes("Content-Disposition: post-data; name="
                    + param.getName() + lineEnd);
            dos.writeBytes(lineEnd);
            dos.writeBytes(param.getValue());
            dos.writeBytes(lineEnd);
        }

        File file;
        Log.d(TAG, "Adding files");
        for (NameValuePair param : mFiles) {
            file = new File(param.getValue());
            if (file.exists()) {
                dos.writeBytes(twoHyphens + boundary + lineEnd);
                dos.writeBytes("Content-Disposition: post-data; name="
                        + param.getName() + "; filename=" + file.getName()
                        + lineEnd);
                dos.writeBytes("Content-Type: application/octet-stream" + lineEnd);
                dos.writeBytes("Content-Transfer-Encoding: binary" + lineEnd);
                dos.writeBytes(lineEnd);

                Log.d(TAG, "Opening fileInputStream");
                FileInputStream fileStream = new FileInputStream(file);
                try {
                    int bytesAvailable;

                    while((bytesAvailable = fileStream.available()) > 0)
                    {
                        int bufferSize = Math.min(bytesAvailable, 4096);
                        byte[] buffer = new byte[bufferSize];
                        int bytesRead = fileStream.read(buffer, 0, bufferSize);
                        dos.write(buffer, 0, bytesRead);
                    }
                    dos.writeBytes(lineEnd);
                } finally {
                    fileStream.close();
                }
                Log.d(TAG, "Closing fileINputStream");
            }
        }

        // very important - we specify the end of the multipart block
        dos.writeBytes(twoHyphens + boundary + twoHyphens + lineEnd);

        dos.flush();
        dos.close();

        // getting response
        if (conn.getResponseCode() == HttpStatus.SC_OK) {
            BufferedInputStream bis = new BufferedInputStream(conn.getInputStream());
            try {
                 ByteArrayBuffer baf = new ByteArrayBuffer(50);
                 int read = 0;
                 int bufSize = 512;
                 byte[] buffer = new byte[bufSize];
                 while(true){
                      read = bis.read(buffer);
                      if(read==-1){
                           break;
                      }
                      baf.append(buffer, 0, read);
                 }
                 Log.d(TAG, "Connection successful - returning result");
                 return new String(baf.toByteArray(), "UTF-8");
            } finally {
                bis.close();
            }
        } else {
            Log.d(TAG, "Return code is " + Integer.toString(conn.getResponseCode()));
            throw new IOException("Return code is " + Integer.toString(conn.getResponseCode()));
        }

    } catch (MalformedURLException e) {
        Log.e(TAG, "Exception: " + e.getMessage(), e);
        throw new IOException("aaa");
    } catch (IOException e) {
        Log.e(TAG, "Exception: " + e.getMessage(), e);
        throw new IOException();
    }
}

UPDATES:
考虑到创建流时的数据损坏......所以我稍微更改了代码以从源流保存文件:

                FileOutputStream fileOutStream = new FileOutputStream(AndorraApplication.getPhotosPath() + "/orig_" +file.getName() );
                DataOutputStream dataOutStream = new DataOutputStream(fileOutStream);


                try {
                    int bytesAvailable;

                    while((bytesAvailable = fileStream.available()) > 0)
                    {
                        int bufferSize = Math.min(bytesAvailable, 4096);
                        byte[] buffer = new byte[bufferSize];
                        int bytesRead = fileStream.read(buffer, 0, bufferSize);
                        dos.write(buffer, 0, bytesRead);
                        dataOutStream.write(buffer, 0, bytesRead);
                    }
                    dos.writeBytes(lineEnd);
                } finally {
                    fileStream.close();
                    dataOutStream.close();
                }

结果是,虽然上传的图像已损坏,但使用 dataOutStream 存储的图像是好的......现在完全丢失了。

Froyo 上的 HTTPUrlConnection 是否有错误?


检查我在这里回答如何将文件(让它成为内存中的图像文件或任何文件)上传到服务器。

Android httpclient文件上传数据损坏和超时问题 https://stackoverflow.com/questions/4896949/android-httpclient-file-upload-data-corruption-and-timeout-issues/4896988#4896988

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

通过http上传时Android图像损坏 的相关文章

随机推荐

  • 为什么 Java 中不能有“List>”? [复制]

    这个问题在这里已经有答案了 在Java中 为什么下面这行代码不起作用 List
  • 如何为超类编写 Hibernate Criteria 查询并检查某个子类?

    如何为超类编写 Hibernate Criteria 查询并检查某个子类 假设我们有以下所有类都与 Hibernate JPA 映射 Entity Inheritance strategy InheritanceType JOINED pu
  • 为什么我无法在 Swift iOS 应用程序中使用 CIFilter 将图像反转回原始图像

    我正在开发一个简单的应用程序 它有一个带有预加载图像和按钮的图像视图 按下按钮时 图像视图中的图像应反转 它第一次工作 但我希望当我再次按下按钮时它会将图像反转回其原始形式 然而 第二次按下按钮时它崩溃了 这是相关代码ViewControl
  • 为什么Swift标准库中的reverse()函数返回Reverse RandomAccessCollection?

    现在我已经学习了 Swift 达到了合理的水平 我正在尝试掌握标准库 但实际上它对我来说主要是 所以一个具体的问题 我有一个字符串数组 我可以对其调用reverse let arr Mykonos Rhodes Naxos reverse
  • 如何向 hline 添加图例?

    我想在 hline 图中添加一个图例 我的子集的头看起来像这样 Site Date Al 1 Bo6 2014 10 07 152 1 2 Bo1 2014 10 07 157 3 3 Bo3 2014 10 07 207 1 4 Bo4
  • 如何在 python pyqtgraph PlotWidget 中设置刻度标签

    我正在尝试绘制每天几个小时的时间序列 每天之间没有空白时间 如果我使用 pg GraphicsWindow 则效果很好 刻度标签为 9 00 10 00 17 00 如果我使用 pg PlotWidget 或 pg PlotWindow A
  • Python 最佳实践 - 在哪里存储 API 密钥/令牌

    我正在构建一个使用 API 令牌和密钥来访问服务的系统 但存储它们的最佳位置在哪里 我想将代码推送到 GitHub 而不推送令牌 目前 我已将它们放在一个名为的空白文件中Constants py并且 在主 python 文件中 我导入Con
  • 将剪辑路径位置移动到鼠标光标

    我有一个 SVG 形状 用作clip path在图像顶部 SVG 形状应遵循鼠标的位置 如果我使用的话我可以让它工作clip path circle 但如果使用则不然clip path url idOfMask 就像我在使用 SVG 作为剪
  • 如何使用 PHP 将 Word 文档转换为 XML?

    我想将 Word 文档 doc 和 docx 转换为 XML 我如何使用 PHP 来做到这一点 完成此操作后 我必须在该 XML 文件中添加一些数据 有人可以帮我吗 Word 文档 docx 是一个xml文件 只需解压即可
  • 无法从字符串中删除“空字符”

    我问过类似的question https stackoverflow com questions 17580662 how to read a text file that contains null character in delphi
  • 模板中的模板输入和模板引用变量

    我们使用 let 关键字创建模板输入变量 同时使用 var 创建模板引用变量 其中 var 是变量的名称 我们可以在模板中的任何位置引用模板引用变量 模板输入变量的范围怎么样 它与模板引用变量的范围有何不同 有人可以通过例子帮助我理解吗 d
  • 反应本机状态不更新

    我感觉我快要疯了 我在搜索栏中输入 x 但是this setState filter text 没有更新状态 console log this state filter 给我一个值 它的初始值在构造函数中设置 我可以看到文本变量的值为 x
  • 如何在 Python 绘图程序中使用多点触控?

    我正在Python中构建一个简单的绘画程序作为一个项目 使用Pygame 它的工作原理是 当按下鼠标并在表面上拖动它时 它基本上会绘制一系列圆圈 它还有其他一些小事情发生 但事情我想问的是 有没有一种方法可以将您知道的 mouse get
  • Python:获取正则表达式匹配的文本

    我在 Python 中有一个正则表达式匹配对象 我想获取它匹配的文本 说如果模式是 1 3 搜索字符串是 abc123xyz 我想得到 123 我怎样才能做到这一点 我知道我可以使用match string match start matc
  • 仅当设置另一个属性时才需要某个属性

    是否可以做一个属性required如果设置了另一个属性 例如 在下面的代码中 viewId必须制作属性required iff action属性已设置 XML
  • 在 OpenMP 中计算矩阵的条目

    我对 openMP 很陌生 但我正在尝试编写一个简单的程序来并行生成矩阵的条目 即对于 N M 矩阵 A 令 A i j i j 下面包含一个最小的示例 include
  • 任务 - 属性分配

    最初 我有以下内容 foreach Product product in products product ImageUri imageClient GetImageUri product GetImagePath 我想做的是并行处理所有产
  • 诗歌如何知道我的包位于 src 文件夹中?

    我有一个简单的问题 我曾经用我的包在根目录下创建一个诗歌项目 project toml mypackage init py mypackage py test mypackage py 我最近将测试移到了另一个目录中 因此该文件夹现在看起来
  • 赋值使指针无需强制转换

    我正在编辑一个快速排序代码 以便低 高和中的值指向数组元素而不是整数 这是我的代码 include
  • 通过http上传时Android图像损坏

    当我将图像从 Android 设备 v 2 2 上传到服务器 带有 php 的 apache 时 基本上 有与这里相同的问题 Android开发图片上传损坏 https stackoverflow com questions 3154224