学习到了安卓上传文件了!!!

在Android端,用到的是android-async-http框架,

github地址为:https://github.com/koush/AndroidAsync/

在AS中搭建该框架超级简单,只需要在build.gradle中加入下面2句(下图中×××标记的2处),然后build一下项目,AS会自动把该框架需要的jar包放入到lib里。

由于sdk自从5.0(或者6.0)之后抛弃了httpclient,所以用这个框架,需要手动添加一些配置,来使Android支持httpclient。

同样在build.gradle中加入标红的那一行配置即可


apply:android{compileSdkVersionbuildToolsVersiondefaultConfig{minSdkVersiontargetSdkVersion}buildTypes{release{proguardFilesgetDefaultProguardFile(),}}}dependencies{compilefileTree(:,:[])androidTestCompile(,{exclude:,:})compilecompiletestCompile}


1、MainActivity

packagecom.yuanlp.fileupload;importandroid.os.Bundle;importandroid.support.v7.app.AppCompatActivity;importandroid.text.TextUtils;importandroid.view.View;importandroid.widget.EditText;importandroid.widget.Toast;importcom.loopj.android.http.AsyncHttpClient;importcom.loopj.android.http.AsyncHttpResponseHandler;importcom.loopj.android.http.RequestParams;importjava.io.BufferedWriter;importjava.io.File;importjava.io.FileWriter;importjava.io.IOException;importcz.msebera.android.httpclient.Header;publicclassMainActivityextendsAppCompatActivity{privateEditTextmPost;@OverrideprotectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);mPost=(EditText)findViewById(R.id.et_post);/***在cache文件夹下创建一个文件,用来上传*/Filefile=newFile(getCacheDir(),"upload.txt");try{BufferedWriterwriter=newBufferedWriter(newFileWriter(file));writer.write("upload,test");writer.flush();}catch(IOExceptione){e.printStackTrace();}}/***button的onclick方法*@paramview*/publicvoidupload(Viewview){Stringpath=mPost.getText().toString().trim();if(TextUtils.isEmpty(path)){Toast.makeText(this,"路径不能为空",Toast.LENGTH_SHORT).show();}Filefile=newFile(path);if(file.exists()&&file.length()>0){//判断文件是否存在,且是否有内容/***下面是用框架做的上传文件*/AsyncHttpClientasyncHttpClient=newAsyncHttpClient();RequestParamsparams=newRequestParams();try{params.put("file1",file);//这个名字一定要与web端获取文件时填写的名字一致,不然multipart获取不到文件asyncHttpClient.post("http://192.168.1.111:10010/aos/talk/audio/savePdaFiles.jhtml",params,newAsyncHttpResponseHandler(){@OverridepublicvoidonSuccess(intstatusCode,Header[]headers,byte[]responseBody){Toast.makeText(MainActivity.this,"上传成功",Toast.LENGTH_SHORT).show();}@OverridepublicvoidonFailure(intstatusCode,Header[]headers,byte[]responseBody,Throwableerror){Toast.makeText(MainActivity.this,"上传失败",Toast.LENGTH_SHORT).show();}});}catch(Exceptione){e.printStackTrace();}}else{Toast.makeText(this,"文件不存在或内容为空",Toast.LENGTH_SHORT).show();}}}


2 java web端,用springMVC

本来获取到multipartfile后,是通过multipart.getInputStream()方式来生成file文件,写入到硬盘的,但是一直获取不到这个输入流,暂时也没查到什么原因。就换了一种方法,直接用multipart的transferTo()方法,参数里是个file类型文件,这样子把文件写入后台

@RequestMapping(value = "savePdaFiles")

public void savePdaFiles(HttpServletRequest request, HttpServletResponse response) {

String file_path=request.getSession().getServletContext().getRealPath("upload/media");

MultipartHttpServletRequest multipartHttpServletRequest=(MultipartHttpServletRequest) request;

MultipartFile multipartFile=multipartHttpServletRequest.getFile("file1");

String fileName=multipartFile.getOriginalFilename();

try {

multipartFile.transferTo(new File(file_path+fileName));

} catch (Exception e1) {

// TODO Auto-generated catch block

e1.printStackTrace();

}

}


3、web.xml配置拦截

<!-- Http请求拦截过滤器 -->

<filter>

<filter-name>httpRequestFilter</filter-name>

<filter-class>cn.osworks.aos.web.asset.HttpRequestFilter</filter-class>

<init-param>

<param-name>enabled</param-name>

<param-value>true</param-value>

</init-param>

<init-param>

<param-name>excludes</param-name>

<param-value>login.jhtml,pdaLogin.jhtml,savePdaFiles.jhtml,savePdaFileList.jhtml,/esb/</param-value>

</init-param>

</filter>