android 上传文件到服务器代码实例
android对于上传文件,还是很简单的,和java里面的上传都是一样的,基本上都是熟悉操作输出流和输入流!还有一个特别重要的就是需要一些content-type这些参数的配置! 如果这些都弄好了,上传就很简单了! 下面是我写的一个上传的工具类:
package com.spring.sky.image.upload.network;
import java.io.dataoutputstream;
import java.io.file;
import java.io.fileinputstream;
import java.io.ioexception;
import java.io.inputstream;
import java.net.httpurlconnection;
import java.net.malformedurlexception;
import java.net.url;
import java.util.uuid;
import android.util.log;
/**
*
* 上传工具类
* @author spring sky
* email:vipa1888@163.com
* qq:840950105
* myname:石明政
*/
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; name=\"img\"; filename=\""+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;
}
}
参数就一个file文件和一个请求上传的url,不过需要注意的是 ,因为需要用到了网络请求,所以大家可不要忘记在上传的时候,给android客户端加一个访问王珞丹呃权限哦!
还有一点就是需要大家注意一下:本人是做服务器端javaee的,我发现在上传的过程中,如果文件的标识name是java关键字之类的,上传过程中,会存在很多位置的问题的!所以大家经可能的不要使用关键字哦!
下面是activity的代码:
package com.spring.sky.image.upload;
import java.io.file;
import com.spring.sky.image.upload.network.uploadutil;
import android.app.activity;
import android.app.alertdialog;
import android.app.dialog;
import android.content.contentresolver;
import android.content.dialoginterface;
import android.content.intent;
import android.database.cursor;
import android.graphics.bitmap;
import android.graphics.bitmapfactory;
import android.net.uri;
import android.os.bundle;
import android.provider.mediastore;
import android.util.log;
import android.view.view;
import android.view.view.onclicklistener;
import android.widget.button;
import android.widget.imageview;
/**
* activity 上传的界面
* @author spring sky
* email:vipa1888@163.com
* qq:840950105
* myname:石明政
*
*/
public class mainactivity extends activity implements onclicklistener{
private static final string tag = "uploadimage";
private static string requesturl = "http://192.168.1.14:8080/setblobdata/img!up";
private button selectimage,uploadimage;
private imageview imageview;
private string picpath = null;
/** called when the activity is first created. */
@override
public void oncreate(bundle savedinstancestate) {
super.oncreate(savedinstancestate);
setcontentview(r.layout.main);
selectimage = (button) this.findviewbyid(r.id.selectimage);
uploadimage = (button) this.findviewbyid(r.id.uploadimage);
selectimage.setonclicklistener(this);
uploadimage.setonclicklistener(this);
imageview = (imageview) this.findviewbyid(r.id.imageview);
}
@override
public void onclick(view v) {
switch (v.getid()) {
case r.id.selectimage:
/***
* 这个是调用android内置的intent,来过滤图片文件 ,同时也可以过滤其他的
*/
intent intent = new intent();
intent.settype("image/*");
intent.setaction(intent.action_get_content);
startactivityforresult(intent, 1);
break;
case r.id.uploadimage:
file file = new file(picpath);
if(file!=null)
{
string request = uploadutil.uploadfile( file, requesturl);
uploadimage.settext(request);
}
break;
default:
break;
}
}
@override
protected void onactivityresult(int requestcode, int resultcode, intent data) {
if(resultcode==activity.result_ok)
{
/**
* 当选择的图片不为空的话,在获取到图片的途径
*/
uri uri = data.getdata();
log.e(tag, "uri = "+ uri);
try {
string[] pojo = {mediastore.images.media.data};
cursor cursor = managedquery(uri, pojo, null, null,null);
if(cursor!=null)
{
contentresolver cr = this.getcontentresolver();
int colunm_index = cursor.getcolumnindexorthrow(mediastore.images.media.data);
cursor.movetofirst();
string path = cursor.getstring(colunm_index);
/***
* 这里加这样一个判断主要是为了第三方的软件选择,比如:使用第三方的文件管理器的话,你选择的文件就不一定是图片了,这样的话,我们判断文件的后缀名
* 如果是图片格式的话,那么才可以
*/
if(path.endswith("jpg")||path.endswith("png"))
{
picpath = path;
bitmap bitmap = bitmapfactory.decodestream(cr.openinputstream(uri));
imageview.setimagebitmap(bitmap);
}else{alert();}
}else{alert();}
} catch (exception e) {
}
}
super.onactivityresult(requestcode, resultcode, data);
}
private void alert()
{
dialog dialog = new alertdialog.builder(this)
.settitle("提示")
.setmessage("您选择的不是有效的图片")
.setpositivebutton("确定",
new dialoginterface.onclicklistener() {
public void onclick(dialoginterface dialog,
int which) {
picpath = null;
}
})
.create();
dialog.show();
}
}
layout代码:
<?xml version="1.0" encoding="utf-8"?>
<linearlayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<button
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="选择图片"
android:id="@+id/selectimage"
/>
<button
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="上传图片"
android:id="@+id/uploadimage"
/>
<imageview
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/imageview"
/>
</linearlayout>
以上就是android 上传图片的全部代码,如果想上传其他文件的话,可以修改过滤条件就可以了,同时文件的类型一定要和服务器端的文件类型保持一致,否则上传就失败了!
上一篇: 晚上吃什么菜好,这里面一定有你喜欢吃的
下一篇: 脾虚吃什么水果好,给你推荐一下