gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:03:08 26 4
gpt4 key购买 nike

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

我正在使用 apache httpmime 4.1 库代码是这样的:

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

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

有时一切正常,但有时(尤其是在连接速度较慢的情况下)上传的图像非常损坏。示例在这里:http://pixelbirthcloud.com/574_orig.jpg

它不会抛出任何异常。上传文件的长度与原始文件的长度相同。尝试将 mime 类型更改为 application/octet-stream 或将其完全删除。尝试玩超时。还是一样的结果。最终用户几乎总是上传损坏的图像(尽管我只设法获得了 2 次 bronem 图像)。图像大小最初是 2.5 兆,但后来我将其减小到 500-700 kb。虽然没有解决问题。

还没有尝试更改 apache 的库..也许这是问题所在..但据我所知,没有人在使用 httpmime 库时遇到过这种情况。

它会是什么?我现在完全迷路了:(

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

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

        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;

import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;

import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;

import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;

import org.xml.sax.Attributes;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import org.xml.sax.XMLReader;
import org.xml.sax.helpers.DefaultHandler;


import android.util.Log;

public class Uploader
{

private String Tag = "UPLOADER";
private String urlString ;//= "YOUR_ONLINE_PHP";
HttpURLConnection conn;
String exsistingFileName ;

private void uploadImageData(String existingFileName , String urlString)
{
String lineEnd = "\r\n";
String twoHyphens = "--";
String boundary = "*****";
try {
// ------------------ CLIENT REQUEST

Log.e(Tag, "Inside second Method");

FileInputStream fileInputStream = new FileInputStream(new File(
exsistingFileName));

// open a URL connection to the Servlet

URL url = new URL(urlString);

// Open a HTTP connection to the URL

conn = (HttpURLConnection) url.openConnection();

// Allow Inputs
conn.setDoInput(true);

// Allow Outputs
conn.setDoOutput(true);

// Don't use a cached copy.
conn.setUseCaches(false);

// Use a post method.
conn.setRequestMethod("POST");

conn.setRequestProperty("Connection", "Keep-Alive");

conn.setRequestProperty("Content-Type",
"multipart/form-data;boundary=" + boundary);

DataOutputStream dos = new DataOutputStream(conn.getOutputStream());

dos.writeBytes(twoHyphens + boundary + lineEnd);
dos
.writeBytes("Content-Disposition: post-data; name=uploadedfile;filename="
+ exsistingFileName + "" + lineEnd);
dos.writeBytes(lineEnd);

Log.v(Tag, "Headers are written");

// create a buffer of maximum size

int bytesAvailable = fileInputStream.available();
int maxBufferSize = 1000;
// int bufferSize = Math.min(bytesAvailable, maxBufferSize);
byte[] buffer = new byte[bytesAvailable];

// read file and write it into form...

int bytesRead = fileInputStream.read(buffer, 0, bytesAvailable);

while (bytesRead > 0) {
dos.write(buffer, 0, bytesAvailable);
bytesAvailable = fileInputStream.available();
bytesAvailable = Math.min(bytesAvailable, maxBufferSize);
bytesRead = fileInputStream.read(buffer, 0, bytesAvailable);
}

// send multipart form data necesssary after file data...

dos.writeBytes(lineEnd);
dos.writeBytes(twoHyphens + boundary + twoHyphens + lineEnd);

// close streams
Log.v(Tag, "File is written");
fileInputStream.close();
dos.flush();
dos.close();

} catch (MalformedURLException ex) {
Log.e(Tag, "error: " + ex.getMessage(), ex);
}

catch (IOException ioe) {
Log.e(Tag, "error: " + ioe.getMessage(), ioe);
}


SAXParserFactory spf = SAXParserFactory.newInstance();
SAXParser sp = null;
try {
sp = spf.newSAXParser();
} catch (ParserConfigurationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SAXException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

// Get the XMLReader of the SAXParser we created.
XMLReader xr = null;
try {
xr = sp.getXMLReader();
} catch (SAXException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
// Create a new ContentHandler and apply it to the XML-Reader
MyExampleHandler1 myExampleHandler = new MyExampleHandler1();
xr.setContentHandler(myExampleHandler);

// Parse the xml-data from our URL.
try {
xr.parse(new InputSource(conn.getInputStream()));
//xr.parse(new InputSource(new java.io.FileInputStream(new java.io.File("login.xml"))));
} catch (MalformedURLException e) {
Log.d("Net Disconnected", "NetDisconeeted");
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
Log.d("Net Disconnected", "NetDisconeeted");
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SAXException e) {
Log.d("Net Disconnected", "NetDisconeeted");
// TODO Auto-generated catch block
e.printStackTrace();
}

// Parsing has finished.

}

public Uploader(String existingFileName, boolean isImageUploading , String urlString ) {

this.exsistingFileName = existingFileName;
this.urlString = urlString;

}

class MyExampleHandler1 extends DefaultHandler
{
// ===========================================================
// Methods
// ===========================================================

@Override
public void startDocument() throws SAXException {

}

@Override
public void endDocument() throws SAXException {
// Nothing to do
}

@Override
public void startElement(String namespaceURI, String localName,
String qName, Attributes atts) throws SAXException {


}

/** Gets be called on closing tags like:
* </tag> */
@Override
public void endElement(String namespaceURI, String localName, String qName)
throws SAXException {


}

/** Gets be called on the following structure:
* <tag>characters</tag> */
@Override
public void characters(char ch[], int start, int length) {

}
}

}

关于Android httpclient 文件上传数据损坏和超时问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4896949/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com