移动开发,经常会遇到图片(多图片),视频,录音,文本信息等复杂数据的提交问题,所以可以让android模拟web表单的方法一次行提交所有数据。我封装了一个公共类。直接上代码,下面的代码需要用到xUtils-2.6.14.jar,httpcore-4.3.3.jar,httpmime-4.3.6.jar
//多数据上传操作类
public class MultiUploadOperation {
private Activity activity;
private List<BasicNameValuePair> texts;
private HashMap<File, String> files;
private String url;
private Dialog dialog;
private OnMultiUploadLinister onMultiUploadLinister;
public MultiUploadOperation(Activity activity, String url,List<BasicNameValuePair> texts, HashMap<File, String> files) {
this.activity = activity;
this.texts = texts;
this.files = files;
this.url = url;
}
public void upload(boolean isShowDialog , String msg) {
if(isShowDialog){
//logingview
LogingDialogView dalogView = new LogingDialogView(activity);
dialog = dalogView.createDialog(msg);
dialog.show();
}
HttpEntity httpEntity = initHttpPostData(url, texts, files);
RequestParams params = new RequestParams("UTF-8");
params.setBodyEntity(httpEntity);
HttpUtils http = HttpUtilsHelper.getHttpUtils();
http.send(HttpMethod.POST, url, params, new RequestCallBack<String>() {
@Override
public void onFailure(HttpException arg0, String error) {
if (onMultiUploadLinister != null) {
onMultiUploadLinister.onFailure(error);
}
if (dialog != null) {
dialog.dismiss();
dialog = null;
}
}
@Override
public void onSuccess(ResponseInfo<String> responseInfo) {
String result = responseInfo.result;
if (onMultiUploadLinister != null) {
onMultiUploadLinister.onSuccess(result);
}
if (dialog != null) {
dialog.dismiss();
dialog = null;
}
}
});
}
/**
* 模拟表单 封装表单数据
*
* @return HttpPost
*/
private HttpEntity initHttpPostData(String url, List<BasicNameValuePair> texts, HashMap<File, String> files) {
MultipartEntityBuilder create = MultipartEntityBuilder.create();
//不要用这个会使服务器接收不到数据
//create.setCharset(Charset.forName("UTF-8"));
// 普通文本的发送,用户名&密码等
if (texts != null && texts.size() > 0) {
for (BasicNameValuePair iterable_element : texts) {
create.addTextBody(iterable_element.getName(),iterable_element.getValue() , ContentType.TEXT_PLAIN.withCharset("UTF-8"));
}
}
// 二进制的发送,文件
if (files != null && files.size() > 0) {
Set<Entry<File, String>> entrySet = files.entrySet();
for (Entry<File, String> iterable_element : entrySet) {
create.addBinaryBody(iterable_element.getValue(),iterable_element.getKey());
}
}
HttpEntity httpEntity = create.build();
return httpEntity;
}
public void setOnMultiUploadLinister(
OnMultiUploadLinister onMultiUploadLinister) {
this.onMultiUploadLinister = onMultiUploadLinister;
}
public interface OnMultiUploadLinister {
public void onSuccess(String result);
public void onFailure(String error);
}
-------------------------------
//使用
private void uploadVideoAndInfo(){
if(videoPath != null || imageNames.size() > 0){
String url = Common.BASE_RUL + "/road/insert";
int user_id = p.getInt("user_id", 0);
String latitude = p.getString("location_latitude", "");
String longitude = p.getString("location_longitude", "");
String address = p.getString("location_address", "");
String detail = input_video_info_detail.getText().toString();
ArrayList<BasicNameValuePair> texts = new ArrayList<BasicNameValuePair>();
texts.add(new BasicNameValuePair("user_id", Integer.valueOf(user_id).toString()));
texts.add(new BasicNameValuePair("longitude", longitude));
texts.add(new BasicNameValuePair("latitude", latitude));
texts.add(new BasicNameValuePair("address", address));
texts.add(new BasicNameValuePair("note", detail));
//封装录像和图片数据
HashMap<File, String> files = null;
if(videoPath != null){
if(files == null){
files = new HashMap<File, String>();
}
if(Utils.fileIsExists(videoPath)){
files.put(new File(videoPath) , "video");
}
if(Utils.fileIsExists(videoImgPath)){
files.put(new File(videoImgPath) , "video_img");
}
}
//封装图片数据
if(imageNames.size() > 0){
if(files == null){
files = new HashMap<File, String>();
}
for (int i = 0; i < imageNames.size(); i++) {
String name = imageNames.get(i);
String path = Common.IMAGE_FILE_PATH + "/" + name;
if(Utils.fileIsExists(path)){
files.put(new File(path) , "images[]");
}
}
}
MultiUploadOperation multiUpload = new MultiUploadOperation(this, url, texts, files);
multiUpload.upload(true , "正在上传...");
multiUpload.setOnMultiUploadLinister(new OnMultiUploadLinister() {
@Override
public void onSuccess(String result) {
try {
JSONObject jsonObj = new JSONObject(result);
int code = jsonObj.getInt("code");
if(code == 200){
ToastHelper.showShortToast(InputVideoAndInfoActivity.this, "上传成功");
finish();
}else{
ToastHelper.showShortToast(InputVideoAndInfoActivity.this, "上传未成功");
}
} catch (JSONException e) {
ToastHelper.showShortToast(InputVideoAndInfoActivity.this, "上传未成功");
}
}
@Override
public void onFailure(String error) {
ToastHelper.showShortToast(InputVideoAndInfoActivity.this, "网络超时,请稍候再试!");
}
});
}else{
ToastHelper.showShortToast(this, "请先拍视频或照片!");
}
}