我有一个问题,多个图像上传到PHP服务器。下面给出的代码适用于android 2.x版本,但相同的代码不适用于android 4.x及更高版本。我google了,发现数据发布必须由AsyncTask异步完成。但我不知道如何通过phonegap(调用异步任务)来完成它。
我在这里有我的代码:
package com.mymedlinks.hybrid;
import java.util.TimeZone;
import org.apache.cordova.api.Plugin;
import org.apache.cordova.api.PluginResult;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import android.content.ContextWrapper;
import android.provider.Settings;
import android.util.Log;
public class SamplePlugin extends Plugin{
public String ACTION_POST_DATA="post_data";
@Override
public PluginResult execute(String arg0, JSONArray arg1, String arg2) {
// TODO Auto-generated method stub
PluginResult pluginRes;
if(ACTION_POST_DATA.equals(arg0)){
try {
pluginResult = imgsUpload(args.getString(0),
args.getString(1), args.getString(2));
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} else{
pluginRes = new PluginResult(PluginResult.Status.INVALID_ACTION);;
}
return pluginRes;
}
private PluginResult imgsUpload(String date,String time,
String fileNames) {
PluginResult pluginResult=null;
HttpURLConnection conn = null;
DataOutputStream dos = null;
DataInputStream inStream = null;
ByteArrayOutputStream baos = null;
byte[] imgData = null;
String urlString = "https://www.mysampledata.com/upload_imgs.php";
//opening of http connection
try {
URL url = new URL(urlString);
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=---------------------------1177141514664");
String msg = "";
StringBuffer buffr = new StringBuffer(msg);
buffr.append("-----------------------------1177141514664");
buffr.append(CrLf);
buffr.append("Content-Disposition: form-data; name=\"date\";"
+ CrLf);
buffr.append(CrLf);
buffr.append(date + CrLf);
buffr.append("-----------------------------1177141514664");
buffr.append(CrLf);
buffr.append("Content-Disposition: form-data; name=\"time\";"
+ CrLf);
buffr.append(CrLf);
buffr.append(time + CrLf);
buffr.append("-----------------------------1177141514664");
buffr.append(CrLf);
buffr.append("Content-Disposition: form-data; name=\"MAX_FILE_SIZE\";"
+ CrLf);
buffr.append(CrLf);
buffr.append("100000000072000" + CrLf);
buffr.append("-----------------------------1177141514664");
buffr.append(CrLf);
buffr.append("Content-Disposition: form-data; name=\"method\";"
+ CrLf);
buffr.append(CrLf);
buffr.append("upload.snapshots" + CrLf);
String msg1 = "";
StringBuffer buffr1 = new StringBuffer(msg1);
List<byte[]> byetsInfo = new ArrayList<byte[]>();
ArrayList<String> filenames = new ArrayList<String>();
try {
JSONObject jObj = new JSONObject(new String(fileNames));
JSONArray jArray = jObj.getJSONArray("snapshot_images");
String drPath = android.os.Environment
.getExternalStorageDirectory().toString();
for (int i = 0; i < jArray.length(); i++) {
String img = jArray.getString(i);
Log.e("sample app", " imageName " + img);
File f = new File(drPath + "/sample_app_images/" + img);
Uri ur = Uri.fromFile(f);
filenames.add(img);
Bitmap bmp;
try {
bmp = Media.getBitmap(this.cordova.getActivity()
.getContentResolver(), ur);
baos = new ByteArrayOutputStream();
bmp.compress(CompressFormat.JPEG, 90, baos);
imgData = baos.toByteArray();
Log.e("sample app", " img data size " + imgData.length);
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
byetsInfo.add(imgData);
}
} catch (JSONException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
String msg3 = "";
StringBuffer buffr3 = new StringBuffer(msg3);
buffr3.append(CrLf);
buffr3.append("-----------------------------4664151417711--");
buffr3.append(CrLf);
conn.setChunkedStreamingMode(0);
for (int i = 0; i < byetsInfo.size(); i++) {
dos = new DataOutputStream(conn.getOutputStream());
buffr1.delete(0, buffr1.length());
buffr1.append("-----------------------------1177141514664");
buffr1.append(CrLf);
buffr1.append("Content-Disposition: form-data; name=\"snapshotUpload[]\"; filename=\""
+ filenames.get(i) + "\"" + CrLf);
buffr1.append("Content-Type: image/jpeg" + CrLf);
buffr1.append(CrLf);
dos.write(buffr.toString().getBytes());
dos.write(buffr1.toString().getBytes());
int index = 0;
int size = 1024;
do {
if ((index + size) < byetsInfo.get(i).length) {
size = byetsInfo.get(i).length - index;
}
dos.write(byetsInfo.get(i), index, size);
index += size;
} while (index < byetsInfo.get(i).length);
Log.e("file upload ", " written: " + index);
dos.write(buffr3.toString().getBytes());
}
Log.e("Debug", "File is written");
Log.e("activity upload demo ",
" in file upload " + conn.getResponseMessage());
dos.flush();
} catch (Exception ec) {
ec.printStackTrace();
}
String s=null;
// Read the response
try {
inStream = new DataInputStream(conn.getInputStream());
char buff = 512;
int len;
byte[] data = new byte[buff];
do {
len = inStream.read(data);
if (len > 0) {
System.out.println(new String(data, 0, len));
s+=new String(data, 0, len);
Log.e("sample app", " "
+ new String(data, 0, len));
}
} while (len > 0);
Log.e("file upload ", " DONE ");
dos.close();
inStream.close();
} catch (Exception ex) {
ex.printStackTrace();
}
try {
if(conn.getResponseMessage().equalsIgnoreCase("OK") && s!=null){
pluginResult = new PluginResult(PluginResult.Status.OK, s);
} else {
pluginResult = new PluginResult(PluginResult.Status.ERROR,
false);
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return pluginResult;
}
}
代码中的数据是我从js代码获得的文件名,日期和时间,它将被发送到上面的类。任何人都可以请我提供一个关于如何通过Phonegap调用异步任务的示例(即,在imgsUpload()中调用它)
非常感谢。
答案 0 :(得分:0)
以下是我用于上传图片到可以与AsynTask一起使用的服务器的工作代码。
//this method takes Inputs (Image name and Image file path where it stored)
//and after upload it returns json response
public String pushImage(String filepath,String imageName){
Log.v(TAG, "path is:"+filepath);
Log.v(TAG, "image name is:"+imageName);
HttpURLConnection conn = null;
DataInputStream inStream = null;
String lineEnd = "\r\n";
String twoHyphens = "--";
String boundary = "---------------------------14737809831466499882746641449";
int bytesRead, bytesAvailable, bufferSize;
byte[] buffer;
int maxBufferSize = 1*1024*1024;
String reponse_data=null;
try{
//------------------ CLIENT REQUEST
//set request properties
// here baseURL is url for uploading image
URL url = new URL(baseURL);
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);
//add request body
DataOutputStream dos = new DataOutputStream( conn.getOutputStream() );
dos.writeBytes(lineEnd+twoHyphens + boundary + lineEnd);
dos.writeBytes("Content-Disposition: form-data; name=\"uploaded\";filename=\"" + imageName + "\"" + lineEnd);
dos.writeBytes("Content-Type: application/octet-stream\r\n\r\n");
//now add image data
FileInputStream fileInputStream = new FileInputStream(new File(filepath) );
bytesAvailable = fileInputStream.available();
bufferSize = Math.min(bytesAvailable, maxBufferSize);
buffer = new byte[bufferSize];
bytesRead = fileInputStream.read(buffer, 0, bufferSize);
while (bytesRead > 0){
dos.write(buffer, 0, bufferSize);
bytesAvailable = fileInputStream.available();
bufferSize = Math.min(bytesAvailable, maxBufferSize);
bytesRead = fileInputStream.read(buffer, 0, bufferSize);
}
dos.writeBytes(lineEnd);
dos.writeBytes(twoHyphens + boundary + twoHyphens + lineEnd);
fileInputStream.close();
dos.flush();
dos.close();
}
catch (MalformedURLException ex){
ex.printStackTrace();
}
catch (IOException ioe){
ioe.printStackTrace();
}
//------------------ read the SERVER RESPONSE
try {
if(conn !=null){
inStream = new DataInputStream ( conn.getInputStream() );
}
String str=null;
if(inStream !=null){
while (( str = inStream.readLine()) != null){
Log.e("Debug","Server Response "+str);
reponse_data=str;
}
inStream.close();
}
}
catch (IOException ioex){
ioex.printStackTrace();
}
return reponse_data;
}
您可以从this链接下载 commons-io-2.4.jar
答案 1 :(得分:0)
我已经为此找到了解决方案,它在Multiple Image Upload using AsyncTask in Android using Phonegap
一旦删除了以下代码行,代码似乎在所有设备上都能正常工作
conn.setChunkedStreamingMode(0);