通过http上传时,Android的形象腐败 [英] Android image corruption when uploading via http

查看:93
本文介绍了通过http上传时,Android的形象腐败的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

当我上传从Android设备的图像(V 2.2)到服务器(Apache支持PHP)
基本上,这里有同样的问题: Android的开发图片上传损坏​​

首先,上传方法基于Apache 4.1 httpcomponent,我认为这个问题是在里面。然后,我已经写了基于HttpURLConnection的我自己上传的库。

我试图用不同的服务器,但它仍然是相同的。

例如:结果
http://pixelbirthcloud.com/corrupted_images/1_orig.jpg - 原始图像结果
http://pixelbirthcloud.com/corrupted_images/1_corrupted.jpg - 我们得到服务器<。 / p>

文件大小是一样的,但在内容的内容有字节损坏块:

  00051330 | 49 69 11 4B 9D E6 | 00051330 | DA BB 10 70 77 DC |
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 C3 64 23 AA | 00051350 | 18 60 1C 7A 0F 33 CF 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 11 1B 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 ...

在code如下。

难道你们有什么想法?什么都试过了,仍然是不'的工作。

 公共字符串的execute()抛出IOException
    字符串lineEnd =\\ r \\ n;
    串twoHyphens = - ;
    字符串边界=***** MultipartBoundary    尝试{
        网址URL =新的URL(穆里);
        HttpURLConnection的康恩=(HttpURLConnection类)url.openConnection();        conn.setDoInput(真);
        conn.setDoOutput(真);
        conn.setUseCaches(假);
        conn.setRequestMethod(POST);
        conn.setRequestProperty(连接,保持活动);
        conn.setRequestProperty(内容类型,
                的multipart / form-data的;边界=+边界);        //超时
        conn.setConnectTimeout(CONNECT_TIMEOUT);
        conn.setReadTimeout(READ_TIMEOUT);        Log.d(TAG,打开connectionStream);
        DataOutputStream类DOS =新的DataOutputStream类(conn.getOutputStream());        Log.d(TAG添加PARAMS);
        对于(参数的NameValuePair:mParams){
            dos.writeBytes(twoHyphens +边界+ lineEnd);
            dos.writeBytes(内容处置:数据后,NAME =
                    + param.getName()+ lineEnd);
            dos.writeBytes(lineEnd);
            dos.writeBytes(param.getValue());
            dos.writeBytes(lineEnd);
        }        档案文件;
        Log.d(TAG,添加文件);
        对于(参数的NameValuePair:mFiles){
            文件=新的文件(param.getValue());
            如果(file.exists()){
                dos.writeBytes(twoHyphens +边界+ lineEnd);
                dos.writeBytes(内容处置:数据后,NAME =
                        + param.getName()+;文件名=+ file.getName()
                        + lineEnd);
                dos.writeBytes(内容类型:应用程序/八位字节流+ lineEnd);
                dos.writeBytes(内容传输编码:二进制+ lineEnd);
                dos.writeBytes(lineEnd);                Log.d(TAG,打开的FileInputStream);
                FILESTREAM的FileInputStream =新的FileInputStream(文件);
                尝试{
                    INT方bytesAvailable;                    而((参考bytesAvailable = fileStream.available())大于0)
                    {
                        INT缓冲区大小= Math.min(方bytesAvailable,4096);
                        字节[]缓冲区=新的字节[缓冲区大小]
                        INT读取动作= fileStream.read(缓冲液,0,缓冲区大小);
                        dos.write(缓冲液,0,读取动作);
                    }
                    dos.writeBytes(lineEnd);
                } {最后
                    fileStream.close();
                }
                Log.d(TAG,关闭的FileInputStream);
            }
        }        //非常重要的 - 我们指定multipart块的结束
        dos.writeBytes(twoHyphens +边界+ twoHyphens + lineEnd);        dos.flush();
        dos.close();        //得到响应
        如果(conn.getResponse code()== HttpStatus.SC_OK){
            二BufferedInputStream为=新的BufferedInputStream(conn.getInputStream());
            尝试{
                 ByteArrayBuffer BAF =新ByteArrayBuffer(50);
                 INT读= 0;
                 INT由bufSize = 512;
                 字节[]缓冲区=新的字节[由bufSize]
                 而(真){
                      读= bis.read(缓冲);
                      如果(读== - 1){
                           打破;
                      }
                      baf.append(缓冲,0,读);
                 }
                 Log.d(TAG,连接成功 - 返回结果);
                 返回新的String(baf.toByteArray(),UTF-8);
            } {最后
                bis.close();
            }
        }其他{
            Log.d(TAG,返回code是+ Integer.toString(conn.getResponse code()));
            抛出新IOException异常(返回code是+ Integer.toString(conn.getResponse code()));
        }    }赶上(MalformedURLException的E){
        Log.e(TAG,异常:+ e.getMessage(),E);
        抛出新IOException异常(AAA);
    }赶上(IOException异常五){
        Log.e(TAG,异常:+ e.getMessage(),E);
        抛出新的IOException异常();
    }
}

更新:结果
创建流时想到了数据损坏..所以我改变了code位来保存从源头流的文件:

 的FileOutputStream fileOutStream =新的FileOutputStream(AndorraApplication.getPhotosPath(+)/ orig_+ file.getName());
                DataOutputStream类dataOutStream =新的DataOutputStream类(fileOutStream);
                尝试{
                    INT方bytesAvailable;                    而((参考bytesAvailable = fileStream.available())大于0)
                    {
                        INT缓冲区大小= Math.min(方bytesAvailable,4096);
                        字节[]缓冲区=新的字节[缓冲区大小]
                        INT读取动作= fileStream.read(缓冲液,0,缓冲区大小);
                        dos.write(缓冲液,0,读取动作);
                        dataOutStream.write(缓冲液,0,读取动作);
                    }
                    dos.writeBytes(lineEnd);
                } {最后
                    fileStream.close();
                    dataOutStream.close();
                }

和谈到,虽然上传的图片被损坏,使用dataOutStream存储形象好...现在完全丧失。

是那里的Froyo或东西吗?

在HttpURLConnection的一个bug
解决方案

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

<一个href=\"http://stackoverflow.com/questions/4896949/android-httpclient-file-upload-data-corruption-and-timeout-issues/4896988#4896988\">

<一个href=\"http://stackoverflow.com/questions/4896949/android-httpclient-file-upload-data-corruption-and-timeout-issues/4896988#4896988\">Android HttpClient的文件上传数据损坏和超时问题

这对我上传的图像伟大的工作。

When I upload image from android device (v 2.2) to a server (apache with php) basically, have same problem as here: Android Development Image Upload Corrupted

At first, the upload method was based on apache httpcomponent 4.1 and i thought the problem was in it. Then I have written my own upload library based on HttpURLConnection.

I tried to use different servers, but it is still the same.

Example:
http://pixelbirthcloud.com/corrupted_images/1_orig.jpg - the original image
http://pixelbirthcloud.com/corrupted_images/1_corrupted.jpg - what we get on server.

File size is the same, but the content in the content there is a corrupted block of bytes:

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       |

I don't know what it depends on, but on my clients' devices the images get much more corrupted. Sometimes it uploads fine, but most of the time the uploaded images are corrupted.

So I guess it's not about the http transfer. it is something about getting stream from sd card to memory and then saving that stream to http...

The code is below.

Do you guys have any ideas? Tried everything and still it doesn't' work.

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:
thought about data corruption when creating streams.. so i changed a code a bit to save the file from the source stream:

                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();
                }

And it comes that while the uploaded image is corrupted, the image stored using dataOutStream is good... completely lost now.

is there a bug in HTTPUrlConnection on Froyo or something?

解决方案

check i answer here how to upload a file(let it be a image file from memory or any file) to a server..

Android httpclient file upload data corruption and timeout issues

it worked great for me for uploading image.

这篇关于通过http上传时,Android的形象腐败的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆