學(xué)習(xí)到了安卓上傳文件了!!!
創(chuàng)新互聯(lián)堅(jiān)持“要么做到,要么別承諾”的工作理念,服務(wù)領(lǐng)域包括:網(wǎng)站建設(shè)、成都網(wǎng)站制作、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣等服務(wù),滿足客戶于互聯(lián)網(wǎng)時(shí)代的雞西網(wǎng)站設(shè)計(jì)、移動(dòng)媒體設(shè)計(jì)的需求,幫助企業(yè)找到有效的互聯(lián)網(wǎng)解決方案。努力成為您成熟可靠的網(wǎng)絡(luò)建設(shè)合作伙伴!
在Android端,用到的是android-async-http框架,
github地址為:https://github.com/koush/AndroidAsync/
在AS中搭建該框架超級(jí)簡單,只需要在build.gradle中加入下面2句(下圖中×××標(biāo)記的2處),然后build一下項(xiàng)目,AS會(huì)自動(dòng)把該框架需要的jar包放入到lib里。
由于sdk自從5.0(或者6.0)之后拋棄了httpclient,所以用這個(gè)框架,需要手動(dòng)添加一些配置,來使Android支持httpclient。
同樣在build.gradle中加入標(biāo)紅的那一行配置即可
apply : android { compileSdkVersion buildToolsVersion defaultConfig { minSdkVersion targetSdkVersion } buildTypes { release { proguardFiles getDefaultProguardFile(), } } } dependencies { compile fileTree(: , : []) androidTestCompile(, { exclude : , : }) compile compile testCompile }
1、MainActivity
package com.yuanlp.fileupload; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.text.TextUtils; import android.view.View; import android.widget.EditText; import android.widget.Toast; import com.loopj.android.http.AsyncHttpClient; import com.loopj.android.http.AsyncHttpResponseHandler; import com.loopj.android.http.RequestParams; import java.io.BufferedWriter; import java.io.File; import java.io.FileWriter; import java.io.IOException; import cz.msebera.android.httpclient.Header; public class MainActivity extends AppCompatActivity { private EditText mPost; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mPost = (EditText) findViewById(R.id.et_post); /** * 在cache文件夾下創(chuàng)建一個(gè)文件,用來上傳 */ File file=new File(getCacheDir(),"upload.txt"); try { BufferedWriter writer=new BufferedWriter(new FileWriter(file)); writer.write("upload,test"); writer.flush(); } catch (IOException e) { e.printStackTrace(); } } /** * button的onclick方法 * @param view */ public void upload(View view){ String path=mPost.getText().toString().trim(); if (TextUtils.isEmpty(path)){ Toast.makeText(this, "路徑不能為空", Toast.LENGTH_SHORT).show(); } File file=new File(path); if (file.exists()&&file.length()>0){ //判斷文件是否存在,且是否有內(nèi)容 /** * 下面是用框架做的上傳文件 */ AsyncHttpClient asyncHttpClient = new AsyncHttpClient(); RequestParams params = new RequestParams(); try { params.put("file1",file); //這個(gè)名字一定要與web端獲取文件時(shí)填寫的名字一致,不然multipart獲取不到文件 asyncHttpClient.post("http://192.168.1.111:10010/aos/talk/audio/savePdaFiles.jhtml", params, new AsyncHttpResponseHandler() { @Override public void onSuccess(int statusCode, Header[] headers, byte[] responseBody) { Toast.makeText(MainActivity.this,"上傳成功",Toast.LENGTH_SHORT).show(); } @Override public void onFailure(int statusCode, Header[] headers, byte[] responseBody, Throwable error) { Toast.makeText(MainActivity.this,"上傳失敗",Toast.LENGTH_SHORT).show(); } }); } catch (Exception e) { e.printStackTrace(); } }else{ Toast.makeText(this, "文件不存在或內(nèi)容為空", Toast.LENGTH_SHORT).show(); } } }
2 java web端,用springMVC
本來獲取到multipartfile后,是通過multipart.getInputStream()方式來生成file文件,寫入到硬盤的,但是一直獲取不到這個(gè)輸入流,暫時(shí)也沒查到什么原因。就換了一種方法,直接用multipart的transferTo()方法,參數(shù)里是個(gè)file類型文件,這樣子把文件寫入后臺(tái)
@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配置攔截