Android 3.x 버전 이상으로 여러 이미지 업로드시이 문제가 있습니다. 내 응용 프로그램은 하이브리드이며 순수한 Android가 아닙니다. Phonegap 인터페이스를 사용하여 Android 코딩을 수행해야합니다. AsyncTask를 사용하여 작성한 코드는 다음과 같습니다. 안드로이드 2.3에서도 똑같이 작동하지만 Android 3.x 이상에서는 작동하지 않습니다. 내 코드를 공유하고 있습니다.Phonegap을 사용하여 Android에서 AsyncTask를 사용하여 여러 이미지 업로드
public class CFileUploader extends Plugin {
private String ACTION_POST_DATA = "cpost_data";
private String CrLf = "\r\n";
String base64Str=null;
@Override
public PluginResult execute(String arg0, JSONArray arg1, String arg2) {
Log.e("Sample App", " IN EXECUTE METHOD ");
PluginResult pluginResult = null;
if (ACTION_POST_DATA.equals(arg0)) {
try {
upload(arg1.getString(0), arg1.getString(1), arg1.getString(2),
arg1.getString(3), arg1.getString(4));
} catch (JSONException jsonex) {
jsonex.printStackTrace();
}
}
return pluginResult;
}
private PluginResult upload(String token, String date, String time,
String email, String fileNames) {
Log.e("Sample App", " IN UPLOAD METHOD ");
PluginResult pluginres = null;
final Data obje=new Data(token, date, time, email, fileNames);
CFileUploader.this.ctx.runOnUiThread(new Runnable(){
public void run(){
MyImageTask mTask=new MyImageTask();
mTask.execute(obje);
}
});
return pluginres;
}
class Data {
String token, date, time, email, fileNames;
Data(String token, String date, String time, String email, String fileNames){
this.token=token;
this.date=date;
this.time=time;
this.email=email;
this.fileNames=fileNames;
}
}
private class MyImageTask extends AsyncTask<Data, String, String>{
@Override
protected String doInBackground(Data... params) {
HttpURLConnection conn = null;
DataOutputStream dos = null;
DataInputStream inStream = null;
ByteArrayOutputStream baos = null;
byte[] imgData = null;
String urlString = "https://www.sampledata.com/myapp/upload_snapshots.php";
Log.e("Sample App", " token " + params[0].token + " " + "date " + params[0].date + " "
+ " time " + params[0].time + " " + "email " + params[0].email);
Log.e("Sample App", " imgPath " + params[0].fileNames);
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 buffer = new StringBuffer(msg);
buffer.append("-----------------------------1177141514664");
buffer.append(CrLf);
buffer.append("Content-Disposition: form-data; name=\"token\";"
+ CrLf);
buffer.append(CrLf);
buffer.append(params[0].token + CrLf);
buffer.append("-----------------------------1177141514664");
buffer.append(CrLf);
buffer.append("Content-Disposition: form-data; name=\"date\";"
+ CrLf);
buffer.append(CrLf);
buffer.append(params[0].date + CrLf);
buffer.append("-----------------------------1177141514664");
buffer.append(CrLf);
buffer.append("Content-Disposition: form-data; name=\"time\";"
+ CrLf);
buffer.append(CrLf);
buffer.append(params[0].time + CrLf);
buffer.append("-----------------------------1177141514664");
buffer.append(CrLf);
buffer.append("Content-Disposition: form-data; name=\"MAX_FILE_SIZE\";"
+ CrLf);
buffer.append(CrLf);
buffer.append("100000000072000" + CrLf);
buffer.append("-----------------------------1177141514664");
buffer.append(CrLf);
buffer.append("Content-Disposition: form-data; name=\"email\";"
+ CrLf);
buffer.append(CrLf);
buffer.append(params[0].email + CrLf);
buffer.append("-----------------------------1177141514664");
buffer.append(CrLf);
buffer.append("Content-Disposition: form-data; name=\"appkey\";"
+ CrLf);
buffer.append(CrLf);
buffer.append("426C3A7D5992B838BAF1BD10594C920C" + CrLf);
buffer.append("-----------------------------1177141514664");
buffer.append(CrLf);
buffer.append("Content-Disposition: form-data; name=\"method\";"
+ CrLf);
buffer.append(CrLf);
buffer.append("upload.snapshots" + CrLf);
String msg1 = "";
StringBuffer imgBuffer = new StringBuffer(msg1);
List<byte[]> byetsInfo = new ArrayList<byte[]>();
ArrayList<String> filenames = new ArrayList<String>();
try {
JSONObject jObj = new JSONObject(new String(params[0].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 + "/myapp_images/" + img);
Uri ur = Uri.fromFile(f);
filenames.add(img);
Bitmap bmp;
try {
bmp = Media.getBitmap(CFileUploader.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 eofBuffer = new StringBuffer(msg3);
eofBuffer.append(CrLf);
eofBuffer.append("-----------------------------4664151417711--");
eofBuffer.append(CrLf);
conn.setChunkedStreamingMode(0);
for (int i = 0; i < byetsInfo.size(); i++) {
dos = new DataOutputStream(conn.getOutputStream());
imgBuffer.delete(0, imgBuffer.length());
imgBuffer.append("-----------------------------4664151417711");
imgBuffer.append(CrLf);
imgBuffer.append("Content-Disposition: form-data; name=\"snapshotUpload[]\"; filename=\""
+ filenames.get(i) + "\"" + CrLf);
imgBuffer.append("Content-Type: image/jpeg" + CrLf);
imgBuffer.append(CrLf);
dos.write(buffer.toString().getBytes());
dos.write(imgBuffer.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(eofBuffer.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();
}
// 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));
base64Str += 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")) {
return base64Str;
} else {
return null;
}
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(String result) {
// TODO Auto-generated method stub
super.onPostExecute(result);
}
}
}
토큰, 날짜, 시간, 전자 메일 및 파일 이름 js 파일에서 가져올 것입니다.
나는이와 함께 base64로 문자열을 얻어야한다 : 나는 위의 안드로이드 3.x 및이 코드를 실행하면
Submitted Requests:
requests={"imageInfo":{"snapshotDateTime":"2012-12-09 22:38:14","snapshots":{"name":["Water lilies.jpg","Sunset.jpg"],"type":["image\/jpeg","image\/jpeg"],"tmp_name":["\/tmp\/phpXmZchs","\/tmp\/phpqylUgX"],"error":[0,0],"size":[83794,71189]}}}
나는 그들 중 하나를 얻고 있지 않다. 내가 잘못 가고하는 것이 많은 somewhere.Thanks 경우
은 저를 수정하십시오.
정확하게 작동하지 않는 부분을 게시하십시오. Logcat 출력도 도움이 될 것입니다. –
@AnupCowkur 세부 사항을 추가했습니다. 제발 봐주세요 – Lavanya
나는 그 문제가'HttpUrlConnection'과 관련이 있을지에 대해 기꺼이 ... Honeycomb이 처음 나왔을 때 클래스의 코드에 대한 여러 구현 관련 변경 사항이 있음을 알고 있습니다. 이 문제를 디버그하려면 http 연결의 응답 상태 (즉, conn.getResponseStatus() ... 결과는 무엇입니까?)를 파악합니다. 귀하의 질문에 그런 종류의 물건을 게시하고 아마도 우리는 더 멀리 도울 수 있습니다. 이미 많은 질문이있는 것 같아서 독자적으로 검색하는 Google을 원할 수도 있습니다 (예 : 마지막 게시물 참조 : http://stackoverflow.com/q/10058516/844882) –