Android httpclient文件上载数据损坏和超时问题

Android httpclient文件上载数据损坏和超时问题,android,http,post,timeout,Android,Http,Post,Timeout,我在android上上传图片时遇到问题 我使用的是ApacheHttpTime 4.1lib 代码如下所示: MultipartEntity reqEntity = new MultipartEntity(HttpMultipartMode.BROWSER_COMPATIBLE); reqEntity.addPart("image", new FileBody(new File(AndorraApplication.getPhotosPath() + "/" + entity.getFileN

我在android上上传图片时遇到问题

我使用的是ApacheHttpTime 4.1lib 代码如下所示:

MultipartEntity reqEntity = new MultipartEntity(HttpMultipartMode.BROWSER_COMPATIBLE);

reqEntity.addPart("image", new FileBody(new File(AndorraApplication.getPhotosPath() + "/" + entity.getFileName()), "image/jpeg"));
resp = NetworkUtils.sendHttpRequestMultipart(EXPORT_PHOTOS_URI, reqEntity);
        HttpParams params = new BasicHttpParams();
        HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1);
        HttpProtocolParams.setContentCharset(params, HTTP.UTF_8);
        HttpProtocolParams.setUseExpectContinue(params, false);  
        HttpConnectionParams.setConnectionTimeout(params, 10000);
        HttpConnectionParams.setSoTimeout(params, 10000);
        ConnManagerParams.setMaxTotalConnections(params, 5);
        ConnManagerParams.setTimeout(params, 30000);

        SchemeRegistry registry = new SchemeRegistry();
        registry.register(new Scheme("http",PlainSocketFactory.getSocketFactory(), 80));
        registry.register(new Scheme("https",PlainSocketFactory.getSocketFactory(), 80));
        ThreadSafeClientConnManager manager = new ThreadSafeClientConnManager(params, registry);
        HttpClient httpclient = new DefaultHttpClient(manager, params);
NetworkUtils类:

public class NetworkUtils {
    public static final int REGISTRATION_TIMEOUT = 3 * 1000; 
    public static final int WAIT_TIMEOUT = 5 * 1000;

    public static HttpResponse sendHttpRequestMultipart(String uri, MultipartEntity entity) {
        HttpClient mHttpClient = new DefaultHttpClient();
        final HttpParams params = mHttpClient.getParams();
        HttpConnectionParams.setConnectionTimeout(params, REGISTRATION_TIMEOUT);
        HttpConnectionParams.setSoTimeout(params, WAIT_TIMEOUT);
        ConnManagerParams.setTimeout(params, WAIT_TIMEOUT);

        HttpPost post = new HttpPost(uri);
        post.addHeader(entity.getContentType());
        post.setEntity(entity);
        HttpResponse resp = mHttpClient.execute(post);
    }
}
有时一切正常,但有时(特别是在低速连接时)上传的图像非常损坏。示例如下:

它不会抛出任何异常。上传文件的长度与原始文件相同。。试图将mime类型更改为应用程序/八位字节流或完全删除它。尝试玩超时游戏。还是一样的结果。最终用户几乎总是上传损坏的图像(尽管我只获得了2次bronem图像)。。起初图像大小是2.5兆,但后来我把它缩小到500-700千字节。但没有解决问题

没有尝试更改apache的库。。也许这就是问题所在。。但据我在网上看到的,没有人在使用httpime库时遇到过这种情况

可能是什么?我现在完全迷路了:(

另一个问题是超时有时不起作用

比如说到这一行: HttpResponse resp=mHttpClient.execute(post); 我禁用3g连接,它只是等待17-20分钟,而不是3或5秒。然后才会抛出异常。尝试了不同的方法。如下所示:

MultipartEntity reqEntity = new MultipartEntity(HttpMultipartMode.BROWSER_COMPATIBLE);

reqEntity.addPart("image", new FileBody(new File(AndorraApplication.getPhotosPath() + "/" + entity.getFileName()), "image/jpeg"));
resp = NetworkUtils.sendHttpRequestMultipart(EXPORT_PHOTOS_URI, reqEntity);
        HttpParams params = new BasicHttpParams();
        HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1);
        HttpProtocolParams.setContentCharset(params, HTTP.UTF_8);
        HttpProtocolParams.setUseExpectContinue(params, false);  
        HttpConnectionParams.setConnectionTimeout(params, 10000);
        HttpConnectionParams.setSoTimeout(params, 10000);
        ConnManagerParams.setMaxTotalConnections(params, 5);
        ConnManagerParams.setTimeout(params, 30000);

        SchemeRegistry registry = new SchemeRegistry();
        registry.register(new Scheme("http",PlainSocketFactory.getSocketFactory(), 80));
        registry.register(new Scheme("https",PlainSocketFactory.getSocketFactory(), 80));
        ThreadSafeClientConnManager manager = new ThreadSafeClientConnManager(params, registry);
        HttpClient httpclient = new DefaultHttpClient(manager, params);

但是仍然不起作用:)

看看我的图像上传程序代码,它对我来说非常有用 这个类将一个文件上传到服务器,并在最后读取XML回复。 根据您的要求筛选代码。。这对我来说相当顺利


package.com.classifieds;
导入java.io.DataOutputStream;
导入java.io.File;
导入java.io.FileInputStream;
导入java.io.IOException;
导入java.net.HttpURLConnection;
导入java.net.MalformedURLException;
导入java.net.URL;
导入javax.xml.parsers.parserConfiguration异常;
导入javax.xml.parsers.SAXParser;
导入javax.xml.parsers.SAXParserFactory;
导入org.xml.sax.Attributes;
导入org.xml.sax.InputSource;
导入org.xml.sax.SAXException;
导入org.xml.sax.XMLReader;
导入org.xml.sax.helpers.DefaultHandler;
导入android.util.Log;
公共类上传器
{
私有字符串Tag=“UPLOADER”;
私有字符串urlString;//=“您的在线\u PHP”;
httpurl连接连接;
字符串存在文件名;
private void uploadImageData(字符串existingFileName,字符串urlString)
{
字符串lineEnd=“\r\n”;
字符串双连字符=“--”;
字符串边界=“*******”;
试一试{
//--------------客户端请求
Log.e(标签“第二种方法内部”);
FileInputStream FileInputStream=新文件inputstream(新文件(
存在文件名);
//打开到Servlet的URL连接
URL=新URL(URL字符串);
//打开到URL的HTTP连接
conn=(HttpURLConnection)url.openConnection();
//允许输入
conn.setDoInput(真);
//允许输出
连接设置输出(真);
//不要使用缓存副本。
conn.SETUSECHACHES(假);
//使用post方法。
conn.setRequestMethod(“POST”);
conn.setRequestProperty(“连接”、“保持活动”);
conn.setRequestProperty(“内容类型”,
“多部分/表单数据;边界=”+边界);
DataOutputStream dos=新的DataOutputStream(conn.getOutputStream());
写字节(两个连字符+边界+行结束);
磁盘操作系统
.writeBytes(“内容处置:发布数据;名称=上载文件;文件名=”
+现有文件名+“”+lineEnd);
dos.writeBytes(lineEnd);
Log.v(标记“写入标题”);
//创建最大大小的缓冲区
int bytesavable=fileInputStream.available();
int maxBufferSize=1000;
//int bufferSize=Math.min(字节可用,maxBufferSize);
字节[]缓冲区=新字节[bytesAvailable];
//读取文件并将其写入表单。。。
int bytesRead=fileInputStream.read(缓冲区,0,字节可用);
而(字节读取>0){
写入(缓冲区,0,字节可用);
bytesAvailable=fileInputStream.available();
bytesAvailable=Math.min(bytesAvailable,maxBufferSize);
bytesRead=fileInputStream.read(缓冲区,0,字节可用);
}
//发送文件数据后所需的多部分表单数据。。。
dos.writeBytes(lineEnd);
写字节(两个连字符+边界+两个连字符+行结束);
//合流
Log.v(标记“文件已写入”);
fileInputStream.close();
dos.flush();
dos.close();
}捕获(格式错误){
Log.e(标记“error:+ex.getMessage(),ex);
}
捕获(ioe异常ioe){
Log.e(标记,“error:+ioe.getMessage(),ioe);
}
SAXParserFactory spf=SAXParserFactory.newInstance();
saxsp=null;
试一试{
sp=spf.newSAXParser();
}捕获(ParserConfiguration异常e){
//TODO自动生成的捕捉块
e、 printStackTrace();
}捕获(SAXE异常){
//TODO自动生成的捕捉块
e、 printStackTrace();
}
//获取我们创建的SAXParser的XMLReader。
XMLReader xr=null;
试一试{
xr=sp.getXMLReader();
}捕获(SAXE异常){
//TODO自动生成的捕捉块
e、 printStackTrace();
}
//创建新的ContentHandler并将其应用于XML读取器
MyExampleHandler1 myExampleHandler=新的MyExampleHandler1();
xr.setContentHandler(myExampleHandler);
//从我们的URL解析xml数据。