您的位置:首页 > 编程语言 > Java开发

android上传图片到Struts2服务器

2012-08-28 22:07 399 查看
1》与同事android纠结很久上传图片到struts2服务器端,在网页中是可以直接通过file控件来选择图片,struts2会将file流直接set到action端的File file变量,然而在于android交互的时候,android端是没有这样的控件的,需要封装成相应的协议,然后通过http,通过url传到action ,服务器action还是用FIle file变量来接。

具体代码如下:

Android端:这是工具类,使用的地方调用UploadUtil.uploadFile(file,url);即可

public class UploadUtil {

private static final String TAG = "uploadFile";

private static final int TIME_OUT = 10*1000; //超时时间

private static final String CHARSET ="utf-8"; //设置编码

/**

* android上传文件到服务器

* @param file 需要上传的文件

* @param RequestURL 请求的rul

* @return 返回响应的内容

*/

public static String uploadFile(File file,String RequestURL)

{

String result = null;

String BOUNDARY = UUID.randomUUID().toString(); //边界标识 随机生成

String PREFIX = "--" , LINE_END = "\r\n";

String CONTENT_TYPE = "multipart/form-data"; //内容类型

try {

URL url = new URL(RequestURL);

HttpURLConnection conn = (HttpURLConnection) url.openConnection();

conn.setReadTimeout(TIME_OUT);

conn.setConnectTimeout(TIME_OUT);

conn.setDoInput(true); //允许输入流

conn.setDoOutput(true); //允许输出流

conn.setUseCaches(false); //不允许使用缓存

conn.setRequestMethod("POST"); //请求方式

conn.setRequestProperty("Charset", CHARSET); //设置编码

conn.setRequestProperty("connection", "keep-alive");

conn.setRequestProperty("Content-Type", CONTENT_TYPE + ";boundary=" + BOUNDARY);

if(file!=null)

{

/**

* 当文件不为空,把文件包装并且上传

*/

DataOutputStream dos = new DataOutputStream( conn.getOutputStream());

StringBuffer sb = new StringBuffer();

sb.append(PREFIX);

sb.append(BOUNDARY);

sb.append(LINE_END);

/**

* 这里重点注意:

* name里面的值为服务器端需要key 只有这个key 才可以得到对应的文件

* filename是文件的名字,包含后缀名的 比如:abc.png

*/

sb.append("Content-Disposition: form-data;
file=\"img\"; fileFilename=\""+file.getName()+"\""+LINE_END);

sb.append("Content-Type: application/octet-stream; charset="+CHARSET+LINE_END);

sb.append(LINE_END);

dos.write(sb.toString().getBytes());

InputStream is = new FileInputStream(file);

byte[] bytes = new byte[1024];

int len = 0;

while((len=is.read(bytes))!=-1)

{

dos.write(bytes, 0, len);

}

is.close();

dos.write(LINE_END.getBytes());

byte[] end_data = (PREFIX+BOUNDARY+PREFIX+LINE_END).getBytes();

dos.write(end_data);

dos.flush();

/**

* 获取响应码 200=成功

* 当响应成功,获取响应的流

*/

int res = conn.getResponseCode();

// Log.e(TAG, "response code:"+res);

// if(res==200)

// {

// Log.e(TAG, "request success");

InputStream input = conn.getInputStream();

StringBuffer sb1= new StringBuffer();

int ss ;

while((ss=input.read())!=-1)

{

sb1.append((char)ss);

}

result = sb1.toString();

// Log.e(TAG, "result : "+ result);

// }

// else{

// Log.e(TAG, "request error");

// }

}

} catch (MalformedURLException e) {

e.printStackTrace();

} catch (IOException e) {

e.printStackTrace();

}

return result;

}

}

服务器端:action中的主要代码

private String fileName;//上传之后得到的文件名

private File file;

然后对应将传过来的流写到本地文件就ok了
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: