一个简单的文件上传例子
1、客户端代码

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 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);            Log.i("上传数据", sb.toString());            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();            Log.i("结束数据", end_data.toString());            dos.write(end_data);            dos.flush();            /**             * 获取响应码 200=成功 当响应成功,获取响应的流             */            int res = conn.getResponseCode();            Log.e(TAG, "response code:" + res);            if (res == 200) {                result = conn.getResponseMessage();                Log.e(TAG, "result : " + result);            } else {                Log.e(TAG, "request error");                result = "NO";            }        }    } catch (MalformedURLException e) {        e.printStackTrace();    } catch (IOException e) {        e.printStackTrace();    }    return result;}

2、服务端代码

public class UploadServlet extends HttpServlet {

@SuppressWarnings("unchecked")protected void service(HttpServletRequest request,        HttpServletResponse response) throws ServletException, IOException {    // String BOUNDARY = UUID.randomUUID().toString();    try {        request.setCharacterEncoding("UTF-8"); // 设置处理请求参数的编码格式        response.setContentType("text/html;charset=UTF-8"); // 设置Content-Type字段值        PrintWriter out = response.getWriter();        out.println("文件开始!");        // 下面的代码开始使用Commons-UploadFile组件处理上传的文件数据        FileItemFactory factory = new DiskFileItemFactory(); // 建立FileItemFactory对象        ServletFileUpload upload = new ServletFileUpload(factory);        // 分析请求,并得到上传文件的FileItem对象        List<FileItem> items = upload.parseRequest(request);        // 从web.xml文件中的参数中得到上传文件的路径        String uploadPath = "d:\\upload\\";        File file = new File(uploadPath);        if (!file.exists()) {            file.mkdir();        }        String filename = ""; // 上传文件保存到服务器的文件名        InputStream is = null; // 当前上传文件的InputStream对象        // 循环处理上传文件        for (FileItem item : items) {            // 处理普通的表单域            if (item.isFormField()) {                if (item.getFieldName().equals("filename")) {                    System.out.println("文件名称      " + item.getFieldName());                    // 如果新文件不为空,将其保存在filename中                    if (!item.getString().equals(""))                        filename = item.getString("UTF-8");                }            }            // 处理上传文件            else if (item.getName() != null && !item.getName().equals("")) {                // 从客户端发送过来的上传文件路径中截取文件名                filename = item.getName().substring(                        item.getName().lastIndexOf("\\") + 1);                System.out.println("文件名称22      " + filename);                is = item.getInputStream(); // 得到上传文件的InputStream对象            }        }        // 将路径和上传文件名组合成完整的服务端路径        filename = uploadPath + "/" + filename;        // 如果服务器已经存在和上传文件同名的文件,则输出提示信息        if (new File(filename).exists()) {            new File(filename).delete();        }        // 开始上传文件        if (!filename.equals("")) {            // 用FileOutputStream打开服务端的上传文件            FileOutputStream fos = new FileOutputStream(filename);            byte[] buffer = new byte[8192]; // 每次读8K字节            int count = 0;            // 开始读取上传文件的字节,并将其输出到服务端的上传文件输出流中            while ((count = is.read(buffer)) > 0) {                fos.write(buffer, 0, count); // 向服务端文件写入字节流            }            fos.close(); // 关闭FileOutputStream对象            is.close(); // InputStream对象            out.println("文件上传成功!");        }    } catch (Exception e) {    }}

}

3、上传示例

new Thread(new Runnable() {    public void run() {        File file = new File(filepath);        UploadUtil uploadUtil = new UploadUtil();        String result = uploadUtil.uploadFile(file, requestURL);        if (result.equals("OK")) {            Log.i("上传返回码", result + " ");            Message message = new Message();            message.obj = "上传完成";            handler.sendMessage(message);        } else {            Message message = new Message();            message.obj = "上传失败";            handler.sendMessage(message);        }    }}).start();

更多相关文章

  1. Android 读取配置文件的内容
  2. android文件上传到服务器
  3. wzplayer for android V1.5.3 (新增YUV文件播放)
  4. android的单个图片 上传服务器
  5. Android解析自定义xml文件(方案一)
  6. Android客制化------开机拷贝文件到内置存储
  7. android拍照上传的效果是如何实现的
  8. android log日志文件输出

随机推荐

  1. Android(安卓)命令行手动编译打包详解
  2. Android(安卓)之 Bluetooth
  3. android自动屏幕旋转流程分析
  4. Android(安卓)SDK与API版本的对应关系
  5. Android(安卓)SQLiteOpenHelper Sqlite数
  6. Android(安卓)屏幕适配
  7. gravity和android:layout_gravity区别
  8. Android菜单详解(三)——SubMenu和IconMenu
  9. Android(安卓)animation 学习
  10. Android名词解释之什么是APK文件