Fix for Issue #172: Out of memory when uploading video using FileTransfer on Android

This commit is contained in:
macdonst 2011-09-22 04:46:43 +08:00
parent 94c1fb3e63
commit bb777c096c
2 changed files with 18 additions and 5 deletions

View File

@ -53,10 +53,14 @@ FileTransfer.prototype.upload = function(filePath, server, successCallback, erro
var fileName = null; var fileName = null;
var mimeType = null; var mimeType = null;
var params = null; var params = null;
var chunkedMode = true;
if (options) { if (options) {
fileKey = options.fileKey; fileKey = options.fileKey;
fileName = options.fileName; fileName = options.fileName;
mimeType = options.mimeType; mimeType = options.mimeType;
if (options.chunkedMode) {
chunkedMode = options.chunkedMode;
}
if (options.params) { if (options.params) {
params = options.params; params = options.params;
} }
@ -65,7 +69,7 @@ FileTransfer.prototype.upload = function(filePath, server, successCallback, erro
} }
} }
PhoneGap.exec(successCallback, errorCallback, 'FileTransfer', 'upload', [filePath, server, fileKey, fileName, mimeType, params, debug]); PhoneGap.exec(successCallback, errorCallback, 'FileTransfer', 'upload', [filePath, server, fileKey, fileName, mimeType, params, debug, chunkedMode]);
}; };
/** /**

View File

@ -81,9 +81,10 @@ public class FileTransfer extends Plugin {
try { try {
JSONObject params = args.optJSONObject(5); JSONObject params = args.optJSONObject(5);
boolean trustEveryone = args.optBoolean(6); boolean trustEveryone = args.optBoolean(6);
boolean chunkedMode = args.getBoolean(7);
if (action.equals("upload")) { if (action.equals("upload")) {
FileUploadResult r = upload(file, server, fileKey, fileName, mimeType, params, trustEveryone); FileUploadResult r = upload(file, server, fileKey, fileName, mimeType, params, trustEveryone, chunkedMode);
Log.d(LOG_TAG, "****** About to return a result from upload"); Log.d(LOG_TAG, "****** About to return a result from upload");
return new PluginResult(PluginResult.Status.OK, r.toJSONObject()); return new PluginResult(PluginResult.Status.OK, r.toJSONObject());
} else { } else {
@ -202,7 +203,7 @@ public class FileTransfer extends Plugin {
* @return FileUploadResult containing result of upload request * @return FileUploadResult containing result of upload request
*/ */
public FileUploadResult upload(String file, String server, final String fileKey, final String fileName, public FileUploadResult upload(String file, String server, final String fileKey, final String fileName,
final String mimeType, JSONObject params, boolean trustEveryone) throws IOException, SSLException { final String mimeType, JSONObject params, boolean trustEveryone, boolean chunkedMode) throws IOException, SSLException {
// Create return object // Create return object
FileUploadResult result = new FileUploadResult(); FileUploadResult result = new FileUploadResult();
@ -240,7 +241,7 @@ public class FileTransfer extends Plugin {
conn = https; conn = https;
} }
} }
// Return a standard HTTP conneciton // Return a standard HTTP connection
else { else {
conn = (HttpURLConnection) url.openConnection(); conn = (HttpURLConnection) url.openConnection();
} }
@ -264,7 +265,12 @@ public class FileTransfer extends Plugin {
if (cookie != null) { if (cookie != null) {
conn.setRequestProperty("Cookie", cookie); conn.setRequestProperty("Cookie", cookie);
} }
// Should set this up as an option
if (chunkedMode) {
conn.setChunkedStreamingMode(maxBufferSize);
}
dos = new DataOutputStream( conn.getOutputStream() ); dos = new DataOutputStream( conn.getOutputStream() );
// Send any extra parameters // Send any extra parameters
@ -357,6 +363,9 @@ public class FileTransfer extends Plugin {
Uri uri = Uri.parse(path); Uri uri = Uri.parse(path);
return ctx.getContentResolver().openInputStream(uri); return ctx.getContentResolver().openInputStream(uri);
} }
else if (path.startsWith("file://")) {
return new FileInputStream(path.substring(6));
}
else { else {
return new FileInputStream(path); return new FileInputStream(path);
} }