以下代码将文件上传到服务器:
import org.apache.http.HttpResponse;
import org.apache.http.HttpStatus;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.mime.content.FileBody;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.params.BasicHttpParams;
import org.apache.http.params.HttpConnectionParams;
import org.apache.http.params.HttpParams;
public String uploadFileForStorage(String serverUrl, String filePath) {
StringBuilder responseMsg = new StringBuilder();
try {
final File file = new File(filePath);
HttpParams httpParameters = new BasicHttpParams();
// Set the timeout in milliseconds until a connection is
// established.
HttpConnectionParams.setConnectionTimeout(httpParameters, UPLOAD_CONNECTION_TIME_OUT);
// Set the default socket timeout (SO_TIMEOUT)
// in milliseconds which is the timeout for waiting for data.
HttpConnectionParams.setSoTimeout(httpParameters, UPLOAD_SOCKET_TIME_OUT);
HttpClient httpClient = new DefaultHttpClient(httpParameters);
if (serverUrl.contains("?")) {
serverUrl = Utils.getProperUrlWithOutEncode(serverUrl);
}
HttpPost postRequest = new HttpPost(serverUrl);
FileBody bin = new FileBody(file);
CustomMultiPartEntity multipartContent = new CustomMultiPartEntity(new ProgressListener() {
@Override
public void transferred(long num) {
total = total + num;
}
});
multipartContent.addPart(CUSTOM_FILE_TAG, bin);
postRequest.setEntity(multipartContent);
HttpResponse response = httpClient.execute(postRequest);
if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
BufferedReader reader = new BufferedReader(new InputStreamReader(response.getEntity().getContent(), "UTF-8"));
String sResponse;
while ((sResponse = reader.readLine()) != null) {
responseMsg = responseMsg.append(sResponse);
}
} else {
responseMsg = responseMsg.append(String.valueOf(response.getStatusLine().getStatusCode()));
}
} catch (Exception e) {
isError = true;
}
return responseMsg.toString();
}
}
正在从Tablet SDCard上传文件。 以上代码适用于多个Android平板电脑,如三星Galaxy Note 10.1& Micromax Funbook 10英寸但在三星P6200上传文件时崩溃。崩溃不会立即发生,但在上传5-10%之后。
此前,上传在三星P6200上运行良好。我将平板电脑恢复出厂设置,但上传时崩溃仍然存在。此外,logO中未显示OutOfMemoryException。该日志在类文件中显示NullPointerException,它不应该。假设问题是HeapSize问题,我该如何处理这个问题。
使用上面的代码,我可以使用SIM卡(3G / WiFi)和三星Galaxy Note 10.1等安卓平板电脑从SDCard上传高达400 MB的文件。 Micromax Funbook 10。
应该添加以下代码行吗?
HttpConnectionParams.setSocketBufferSize(httpParameters, 8192);
// or any value other than //8192
答案 0 :(得分:0)
postRequest.setEntity(multipartContent); HttpResponse response = httpClient.execute(postRequest);
如果怀疑堆问题,那么您应该检查httpclient的实现/来源。我猜你正在使用apache客户端,所以你可以检查那里。
有2个内存问题。
当文件标记被映射到内存时(在使用套接字之前),使用了多大的缓冲区?您可能需要深入研究将文件映射到内存的代码,并使其符合较小的可用内存/缓冲区大小。
套接字开始上传后,client.execute使用另一个缓冲周期从文件内存中读取并写入用于上载的套接字。除了在套接字缓冲区大小上使用config之外,您可能还想尝试使用上传进行“chunked-encoding”(流式传输)。转储您的标题,您应该能够看到您使用的Mime Multipart表单是否导致“chunked-encoding”的http标头。
对于可用于大型上传的分块example with httpUrlConnection。在源代码中找到“ChunkedStreamingMode”。