android上传文件到java服务器上_三十二、Android上传文件至服务器

本文演示了如何使用Android客户端每隔5秒上传文件到服务器,服务器端使用Struts2接收并处理文件。主要涉及Android的SocketHttpRequester类和服务器端的UploadAction类,实现了文件上传和信息交互。
摘要由CSDN通过智能技术生成

本实例实现每隔5秒上传一次,通过服务器端获取手机上传过来的文件信息并做相应处理;采用Android+Struts2技术。

一、Android端实现文件上传

1)、新建一个Android项目命名为androidUpload,目录结构如下:

c7b14ed879e68ee51d9f8ebdbe764d57.png

2)、新建FormFile类,用来封装文件信息

package com.ljq.utils;

import java.io.File;

import java.io.FileInputStream;

import java.io.FileNotFoundException;

import java.io.InputStream;

/*** 上传文件*/

public class FormFile {

/*上传文件的数据*/

private byte[] data;

private InputStream inStream;

private File file;

/*文件名称*/

private String filname;

/*请求参数名称*/

private String parameterName;

/*内容类型*/

private String contentType = "application/octet-stream";

public FormFile(String filname, byte[] data, String parameterName, String contentType) {

this.data = data;

this.filname = filname;

this.parameterName = parameterName;

if(contentType!=null) this.contentType = contentType;

}

public FormFile(String filname, File file, String parameterName, String contentType) {

this.filname = filname;

this.parameterName = parameterName;

this.file = file;

try {

this.inStream = new FileInputStream(file);

} catch (FileNotFoundException e) {

e.printStackTrace();

}

if(contentType!=null) this.contentType = contentType;

}

public File getFile() {

return file;

}

public InputStream getInStream() {

return inStream;

}

public byte[] getData() {

return data;

}

public String getFilname() {

return filname;

}

public void setFilname(String filname) {

this.filname = filname;

}

public String getParameterName() {

return parameterName;

}

public void setParameterName(String parameterName) {

this.parameterName = parameterName;

}

public String getContentType() {

return contentType;

}

public void setContentType(String contentType) {

this.contentType = contentType;

}

}

3)、新建SocketHttpRequester类,封装上传文件到服务器代码

package com.ljq.utils;

import java.io.BufferedReader;

import java.io.InputStreamReader;

import java.io.OutputStream;

import java.net.InetAddress;

import java.net.Socket;

import java.net.URL;

import java.util.Map;

/*** 上传文件到服务器

*

*@authorAdministrator

**/

public class SocketHttpRequester {

/*** 直接通过HTTP协议提交数据到服务器,实现如下面表单提交功能:

*

*@parampath 上传路径(注:避免使用localhost或127.0.0.1这样的路径测试,因为它会指向手机模拟器,你可以使用http://www.iteye.cn或http://192.168.1.101:8083这样的路径测试)

*@paramparams 请求参数 key为参数名,value为参数值

*@paramfile 上传文件*/

public static boolean post(String path, Map params, FormFile[] files) throws Exception{

final String BOUNDARY = "---------------------------7da2137580612"; //数据分隔线 final String endline = "--" + BOUNDARY + "--\r\n";//数据结束标志

int fileDataLength = 0;

for(FormFile uploadFile : files){//得到文件类型数据的总长度 StringBuilder fileExplain = new StringBuilder();

fileExplain.append("--");

fileExplain.append(BOUNDARY);

fileExplain.append("\r\n");

fileExplain.append("Content-Disposition: form-data;name=\""+ uploadFile.getParameterName()+"\";filename=\""+ uploadFile.getFilname() + "\"\r\n");

fileExplain.append("Content-Type: "+ uploadFile.getContentType()+"\r\n\r\n");

fileExplain.append("\r\n");

fileDataLength += fileExplain.length();

if(uploadFile.getInStream()!=null){

fileDataLength += uploadFile.getFile().length();

}else{

fileDataLength += uploadFile.getData().length;

}

}

StringBuilder textEntity = new StringBuilder();

for (Map.Entry entry : params.entrySet()) {//构造文本类型参数的实体数据 textEntity.append("--");

textEntity.append(BOUNDARY);

textEntity.append("\r\n");

textEntity.append("Content-Disposition: form-data; name=\""+ entry.getKey() + "\"\r\n\r\n");

textEntity.append(entry.getValue());

textEntity.append("\r\n");

}

//计算传输给服务器的实体数据总长度 int dataLength = textEntity.toString().getBytes().length + fileDataLength + endline.getBytes().length;

URL url = new URL(path);

int port = url.getPort()==-1 ? 80 : url.getPort();

Socket socket = new Socket(InetAddress.getByName(url.getHost()), port);

OutputStream outStream = socket.getOutputStream();

//下面完成HTTP请求头的发送 String requestmethod = "POST "+ url.getPath()+" HTTP/1.1\r\n";

outStream.write(requestmethod.getBytes());

String accept = "Accept: image/gif, image/jpeg, image/pjpeg, image/pjpeg, application/x-shockwave-flash, application/xaml+xml, application/vnd.ms-xpsdocument, application/x-ms-xbap, application/x-ms-application, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*\r\n";

outStream.write(accept.getBytes());

String language = "Accept-Language: zh-CN\r\n";

outStream.write(language.getBytes());

String contenttype = "Content-Type: multipart/form-data; boundary="+ BOUNDARY+ "\r\n";

outStream.write(contenttype.getBytes());

String contentlength = "Content-Length: "+ dataLength + "\r\n";

outStream.write(contentlength.getBytes());

String alive = "Connection: Keep-Alive\r\n";

outStream.write(alive.getBytes());

String host = "Host: "+ url.getHost() +":"+ port +"\r\n";

outStream.write(host.getBytes());

//写完HTTP请求头后根据HTTP协议再写一个回车换行 outStream.write("\r\n".getBytes());

//把所有文本类型的实体数据发送出来 outStream.write(textEntity.toString().getBytes());

//把所有文件类型的实体数据发送出来 for(FormFile uploadFile : files){

StringBuilder fileEntity = new StringBuilder();

fileEntity.append("--");

fileEntity.append(BOUNDARY);

fileEntity.append("\r\n");

fileEntity.append("Content-Disposition: form-data;name=\""+ uploadFile.getParameterName()+"\";filename=\""+ uploadFile.getFilname() + "\"\r\n");

fileEntity.append("Content-Type: "+ uploadFile.getContentType()+"\r\n\r\n");

outStream.write(fileEntity.toString().getBytes());

if(uploadFile.getInStream()!=null){

byte[] buffer = new byte[1024];

int len = 0;

while((len = uploadFile.getInStream().read(buffer, 0, 1024))!=-1){

outStream.write(buffer, 0, len);

}

uploadFile.getInStream().close();

}else{

outStream.write(uploadFile.getData(), 0, uploadFile.getData().length);

}

outStream.write("\r\n".getBytes());

}

//下面发送数据结束标志,表示数据已经结束 outStream.write(endline.getBytes());

BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));

if(reader.readLine().indexOf("200")==-1){//读取web服务器返回的数据,判断请求码是否为200,如果不是200,代表请求失败 return false;

}

outStream.flush();

outStream.close();

reader.close();

socket.close();

return true;

}

/*** 提交数据到服务器

*@parampath 上传路径(注:避免使用localhost或127.0.0.1这样的路径测试,因为它会指向手机模拟器,你可以使用http://www.itcast.cn或http://192.168.1.10:8080这样的路径测试)

*@paramparams 请求参数 key为参数名,value为参数值

*@paramfile 上传文件*/

public static boolean post(String path, Map params, FormFile file) throws Exception{

return post(path, params, new FormFile[]{file});

}

}

4)、新建MainActivity类,实现每隔5秒上传一次

package com.ljq.activity;

import java.io.File;

import java.util.HashMap;

import java.util.Map;

import android.app.Activity;

import android.os.Bundle;

import android.os.Environment;

import android.os.Handler;

import android.util.Log;

import com.ljq.utils.FormFile;

import com.ljq.utils.SocketHttpRequester;

public class MainActivity extends Activity {

private File file;

private Handler handler;

private static final String TAG="MainActivity";

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.main);

Log.i(TAG, "onCreate");

file = new File(Environment.getExternalStorageDirectory(), "123.rmvb");

Log.i(TAG, "照片文件是否存在:"+file);

handler=new Handler();

handler.post(runnable);

}

Runnable runnable=new Runnable() {

public void run() {

Log.i(TAG, "runnable run");

uploadFile(file);

handler.postDelayed(runnable, 5000);

}

};

/*** 上传图片到服务器

*

*@paramimageFile 包含路径*/

public void uploadFile(File imageFile) {

Log.i(TAG, "upload start");

try {

String requestUrl = "http://192.168.1.101:8083/upload/upload/execute.do";

//请求普通信息 Map params = new HashMap();

params.put("username", "张三");

params.put("pwd", "zhangsan");

params.put("age", "21");

params.put("fileName", imageFile.getName());

//上传文件 FormFile formfile = new FormFile(imageFile.getName(), imageFile, "image", "application/octet-stream");

SocketHttpRequester.post(requestUrl, params, formfile);

Log.i(TAG, "upload success");

} catch (Exception e) {

Log.i(TAG, "upload error");

e.printStackTrace();

}

Log.i(TAG, "upload end");

}

}

5)、修改清单文件

package="com.ljq.activity"

android:versionCode="1"

android:versionName="1.0">

android:label="@string/app_name">

启动模拟器,运行如下:

8543dad4d3433d3c500344efa4fbb5f7.png

二、服务器端用来获取Android端上传过来的文件信息

1)、新建一个web项目命名为upload,目录结构如下

8d8f9fedac5420e6b7a9c6252b2a70ea.png

注意:记得加入struts2 jar包,需加入的jar如下

cf0b1efc7e53d11c1a391591af08066c.png

2)、新建action类,命名为UploadAction,内容如下

package com.ljq.action;

import java.io.File;

import java.io.FileInputStream;

import java.io.FileOutputStream;

import java.io.IOException;

import javax.servlet.http.HttpServletRequest;

import org.apache.struts2.ServletActionContext;

import com.opensymphony.xwork2.ActionSupport;

/*** 获取Android端上传过来的信息

*

*@authorAdministrator

**/

@SuppressWarnings("serial")

public class UploadAction extends ActionSupport {

//上传文件域 private File image;

//上传文件类型 private String imageContentType;

//封装上传文件名 private String imageFileName;

//接受依赖注入的属性 private String savePath;

@Override

public String execute() {

HttpServletRequest request=ServletActionContext.getRequest();

FileOutputStream fos = null;

FileInputStream fis = null;

try {

System.out.println("获取Android端传过来的普通信息:");

System.out.println("用户名:"+request.getParameter("username"));

System.out.println("密码:"+request.getParameter("pwd"));

System.out.println("年龄:"+request.getParameter("age"));

System.out.println("文件名:"+request.getParameter("fileName"));

System.out.println("获取Android端传过来的文件信息:");

System.out.println("文件存放目录: "+getSavePath());

System.out.println("文件名称: "+imageFileName);

System.out.println("文件大小: "+image.length());

System.out.println("文件类型: "+imageContentType);

fos = new FileOutputStream(getSavePath() + "/" + getImageFileName());

fis = new FileInputStream(getImage());

byte[] buffer = new byte[1024];

int len = 0;

while ((len = fis.read(buffer)) != -1) {

fos.write(buffer, 0, len);

}

System.out.println("文件上传成功");

} catch (Exception e) {

System.out.println("文件上传失败");

e.printStackTrace();

} finally {

close(fos, fis);

}

return SUCCESS;

}

/*** 文件存放目录

*

*@return*/

public String getSavePath() throws Exception{

return ServletActionContext.getServletContext().getRealPath(savePath);

}

public void setSavePath(String savePath) {

this.savePath = savePath;

}

public File getImage() {

return image;

}

public void setImage(File image) {

this.image = image;

}

public String getImageContentType() {

return imageContentType;

}

public void setImageContentType(String imageContentType) {

this.imageContentType = imageContentType;

}

public String getImageFileName() {

return imageFileName;

}

public void setImageFileName(String imageFileName) {

this.imageFileName = imageFileName;

}

private void close(FileOutputStream fos, FileInputStream fis) {

if (fis != null) {

try {

fis.close();

fis=null;

} catch (IOException e) {

System.out.println("FileInputStream关闭失败");

e.printStackTrace();

}

}

if (fos != null) {

try {

fos.close();

fis=null;

} catch (IOException e) {

System.out.println("FileOutputStream关闭失败");

e.printStackTrace();

}

}

}

}

3)、配置struts.xml

/p>

"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"

"http://struts.apache.org/dtds/struts-2.0.dtd">

/image

/WEB-INF/page/message.jsp

4)、配置web.xml

http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">

struts2

org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter

struts2

/*

strutsCleanup

org.apache.struts2.dispatcher.ActionContextCleanUp

strutsCleanup

/*

index.jsp

运行结构如下:

获取Android端传过来的普通信息:

用户名:张三

密码:zhangsan

年龄:21

文件名:123.rmvb

获取Android端传过来的文件信息:

文件存放目录: D:\apache-tomcat-6.0.18\webapps\upload\image

文件名称: 123.rmvb

文件大小: 3962649

文件类型: application/octet-stream

文件上传成功

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值