首先感谢帮助过我的众多程序员大叔们,这是我的第一篇博客
最近,在和朋友聊天的时候帮助别人处理一个上传文件到自己服务器的程序,半天并没有解决那个问题后来有事情就耽误了,这两天想起来,便自己做了这么一个小Demo,就当练练手了,也让我掌握了很多android网络传输方面的知识,程序完善的不是很好,只是实现了服务器授权登陆,并上传文件(可选择)到服务器指定地址的功能。
登录界面获取登录名及密码后,上传至服务器,服务器验证成功反馈给手机端login success,如图:
public class MainActivity extends Activity {
protected static final int OK = 0;
private Handler handler;
private EditText et_username;
private EditText et_userpwd;
private String result="";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
et_username=(EditText) this.findViewById(R.id.editText1);
et_userpwd=(EditText) this.findViewById(R.id.editText2);
handler=new Handler(){
public void handleMessage(Message msg) {
if (msg.what == OK){
Toast.makeText(MainActivity.this, result, Toast.LENGTH_SHORT).show();
Intent intent = new Intent(MainActivity.this,UpTranslateActivity.class);
startActivity(intent);
}
}
};
}
public void click(View v){
new Thread(){
public void run(){
String name=et_username.getText().toString();
String pwd=et_userpwd.getText().toString();
try {
URL url=new URL("http://192.168.191.1:8080/andro/AndroidServlet?username="+name+"&userpwd="+pwd);
System.out.println("url="+url);
HttpURLConnection conn=(HttpURLConnection) url.openConnection();
System.out.println("conn="+conn);
//conn.setConnectTimeout(5000);
//conn.setRequestMethod("GET");
if(conn.getResponseCode()==200){
System.out.println("访问成功");
InputStream in=conn.getInputStream();
BufferedReader br=new BufferedReader(new InputStreamReader(in));
result=br.readLine();
System.out.println("返回 结果是:"+result);
Message msg=new Message();
msg.what=OK;
handler.sendMessage(msg);
}
else{
System.out.println("访问失败");
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}.start();
}
}
登录成功后,自动跳转至上传图片的界面中,服务器的接受地址URL(例如我的:http://192.168.191.1:8080/andro/UploadShipServlet)固定显示到TextView中, 可以手动打开文件选择器进行图片以及文件的选择,选择完成TextView自动显示文件或者图片在手机中的位置,此时点击上传,就可以上传至服务器端。文件选择器效果如图:
public class UpTranslateActivity extends Activity {
public static final int FILE_SELECT_CODE = 1;
private EditText Ed_Url;
private EditText Ed_Wenjian;
private Button upload;
private Button choose;
private String uploadFile ="/sdcard/123.jpg";
private String actionUrl = "http://192.168.191.1:8080/andro/UploadShipServlet";
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
this.setContentView(R.layout.activity_up_translate);
Ed_Url = (EditText) findViewById(R.id.ed_url);
Ed_Wenjian = (EditText) findViewById(R.id.ed_wenjian);
upload = (Button) findViewById(R.id.bt_up);
choose =(Button) findViewById(R.id.bt_choose);
Ed_Url.setText(actionUrl);
Ed_Wenjian.setText(uploadFile);
upload.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
new Thread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
File file = new File(Ed_Wenjian.getText().toString());
String result = UploadUtil.uploadFile(file, actionUrl);
Message msg = new Message();
msg.what = 1;
msg.obj = result;
handler.sendMessage(msg);
}
}).start();
}
});
choose.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
showFileChooser();//打开文件选择器
}
});
}
private Handler handler = new Handler(){
public void handleMessage(Message msg) {
switch(msg.what){
case 1:
showDialog("服务器存储路径:\n"+msg.obj);
break;
}
}
};
private void showFileChooser() {
Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.setType("*/*");
intent.addCategory(Intent.CATEGORY_OPENABLE);
try {
startActivityForResult( Intent.createChooser(intent, "Select a File to Upload"), FILE_SELECT_CODE);
} catch (android.content.ActivityNotFoundException ex) {
Toast.makeText(this, "Please install a File Manager.", Toast.LENGTH_SHORT).show();
}
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
// TODO Auto-generated method stub
super.onActivityResult(requestCode, resultCode, data);
switch(requestCode){
case FILE_SELECT_CODE:
if(resultCode == RESULT_OK){
Uri uri = data.getData();
String path = FileUtils.getPath(this, uri);
Ed_Wenjian.setText(path);
}
break;
}
}
}
服务器端代码对登录信息进行验证(简单的进行了验证,没写数据库),这里就不贴登录验证的代码了,然后对文件进行了接收处理,上代码:
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
request.setCharacterEncoding("utf-8");
response.setCharacterEncoding("utf-8");
PrintWriter out = response.getWriter();
// 创建文件项目工厂对象
DiskFileItemFactory factory = new DiskFileItemFactory();
// 设置文件上传路径
String upload = this.getServletContext().getRealPath("/");
// 获取系统默认的临时文件保存路径,该路径为Tomcat根目录下的temp文件夹
String temp = System.getProperty("java.io.tmpdir");
// 设置缓冲区大小为 5M
factory.setSizeThreshold(1024 * 1024 * 5);
// 设置临时文件夹为temp
factory.setRepository(new File(temp));
// 用工厂实例化上传组件,ServletFileUpload 用来解析文件上传请求
ServletFileUpload servletFileUpload = new ServletFileUpload(factory);
// 解析结果放在List中
try {
List<FileItem> list = servletFileUpload.parseRequest(request);
for (FileItem item : list) {
String name = item.getFieldName();
InputStream is = item.getInputStream();
if (name.contains("content")) {
System.out.println(inputStream2String(is));
} else if (name.contains("img")) {
try {
path = upload+"\\"+item.getName();
inputStream2File(is, path);
break;
} catch (Exception e) {
e.printStackTrace();
}
}
}
out.write(path); //返回给客户端上传成功后路径
} catch (FileUploadException e) {
e.printStackTrace();
System.out.println("failure");
out.write("failure");
}
out.flush();
out.close();
}
// 流转化成字符串
public static String inputStream2String(InputStream is) throws IOException {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
int i = -1;
while ((i = is.read()) != -1) {
baos.write(i);
}
return baos.toString();
}
// 流转化成文件
public static void inputStream2File(InputStream is, String savePath) throws Exception {
System.out.println("文件保存路径为:" + savePath);
File file = new File(savePath);
InputStream inputSteam = is;
BufferedInputStream fis = new BufferedInputStream(inputSteam);
FileOutputStream fos = new FileOutputStream(file);
int f;
while ((f = fis.read()) != -1) {
fos.write(f);
}
fos.flush();
fos.close();
fis.close();
inputSteam.close();
}