当前位置: 移动技术网 > IT编程>移动开发>Android > android 上传文件到服务器代码实例

android 上传文件到服务器代码实例

2019年07月24日  | 移动技术网IT编程  | 我要评论

德高望重近义词,环鄱阳湖城市群,电影下载论坛

 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 上传图片的全部代码,如果想上传其他文件的话,可以修改过滤条件就可以了,同时文件的类型一定要和服务器端的文件类型保持一致,否则上传就失败了!

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网