Android -- 图片异步上传到PHP服务器

简介:

背景                                                                                          

网上很多上传到java服务器上的,找了好久,找到了上传到php的了,思路跟我当初想的差不多,就是POST过去。废话不多说,直接上图看代码。

imageimage

image

php代码                                                                                    

复制代码
<?php
$target_path  = "./upload/";//接收文件目录
$target_path = $target_path . basename( $_FILES['uploadedfile']['name']);
if(move_uploaded_file($_FILES['uploadedfile']['tmp_name'], $target_path)) {
   echo "The file ".  basename( $_FILES['uploadedfile']['name']). " has been uploaded";
}  else{
   echo "There was an error uploading the file, please try again!" . $_FILES['uploadedfile']['error'];
}
?>
复制代码

Android代码                                                                              

上传的主要代码:

复制代码
private void uploadFile(String uploadUrl)
  {
    String end = "\r\n";
    String twoHyphens = "--";
    String boundary = "******";
    try
    {
      URL url = new URL(uploadUrl);
      HttpURLConnection httpURLConnection = (HttpURLConnection) url
          .openConnection();//http连接
      // 设置每次传输的流大小,可以有效防止手机因为内存不足崩溃
      // 此方法用于在预先不知道内容长度时启用没有进行内部缓冲的 HTTP 请求正文的流。
      httpURLConnection.setChunkedStreamingMode(128 * 1024);// 128K
      // 允许输入输出流
      httpURLConnection.setDoInput(true);
      httpURLConnection.setDoOutput(true);
      httpURLConnection.setUseCaches(false);
      // 使用POST方法
      httpURLConnection.setRequestMethod("POST");
      httpURLConnection.setRequestProperty("Connection", "Keep-Alive");//保持一直连接
      httpURLConnection.setRequestProperty("Charset", "UTF-8");//编码
      httpURLConnection.setRequestProperty("Content-Type",
          "multipart/form-data;boundary=" + boundary);//POST传递过去的编码

      DataOutputStream dos = new DataOutputStream(
          httpURLConnection.getOutputStream());//输出流
      dos.writeBytes(twoHyphens + boundary + end);
      dos.writeBytes("Content-Disposition: form-data; name=\"uploadedfile\"; filename=\""
          + srcPath.substring(srcPath.lastIndexOf("/") + 1)
          + "\""
          + end);
      dos.writeBytes(end);

      FileInputStream fis = new FileInputStream(srcPath);//文件输入流,写入到内存中
      byte[] buffer = new byte[8192]; // 8k
      int count = 0;
      // 读取文件
      while ((count = fis.read(buffer)) != -1)
      {
        dos.write(buffer, 0, count);
      }
      fis.close();

      dos.writeBytes(end);
      dos.writeBytes(twoHyphens + boundary + twoHyphens + end);
      dos.flush();

      InputStream is = httpURLConnection.getInputStream();//http输入,即得到返回的结果
      InputStreamReader isr = new InputStreamReader(is, "utf-8");
      BufferedReader br = new BufferedReader(isr);
      String result = br.readLine();

      Toast.makeText(this, result, Toast.LENGTH_LONG).show();//将结果输出
      dos.close();
      is.close();

    } catch (Exception e)
    {
      e.printStackTrace();
      setTitle(e.getMessage());
    }
  }
复制代码

因为安卓4.0之后耗时间的操作要求都在非UI线程中操作,即将前面的AsyncTask拿来用了吧~

AsyncTask传送门:http://www.cnblogs.com/yydcdut/p/3707960.html

在这个类中,将上传的操作放在doInBackground当中,可以有ProgressDialog显示上传了多少:

复制代码
// Read file
            bytesRead = fileInputStream.read(buffer, 0, bufferSize);

            while (bytesRead > 0) {
                outputStream.write(buffer, 0, bufferSize);
                length += bufferSize;
                progress = (int) ((length * 100) / totalSize);
                publishProgress(progress);

                bytesAvailable = fileInputStream.available();
                bufferSize = Math.min(bytesAvailable, maxBufferSize);
                bytesRead = fileInputStream.read(buffer, 0, bufferSize);
            }
            outputStream.writeBytes(lineEnd);
            outputStream.writeBytes(twoHyphens + boundary + twoHyphens
                    + lineEnd);
            publishProgress(100);
复制代码

还有就是,注意权限哟:

<uses-permission android:name="android.permission.INTERNET" />

我是天王盖地虎的分割线                                                                 

源代码:http://pan.baidu.com/s/1dD1Qx01

Update.zip

 

 




本文转自我爱物联网博客园博客,原文链接:http://www.cnblogs.com/yydcdut/p/3720635.html,如需转载请自行联系原作者

相关文章
|
2月前
|
应用服务中间件 PHP nginx
当你的nginx服务器和php服务器不在一起的时候,这个nginx 的root目录问题
两个服务器的网站代码目录需要对齐,docker容器里面也是一样
|
5月前
|
Android开发 数据安全/隐私保护 虚拟化
安卓手机远程连接登录Windows服务器教程
安卓手机远程连接登录Windows服务器教程
934 4
|
5月前
|
XML 前端开发 JavaScript
PHP与Ajax在Web开发中的交互技术。PHP作为服务器端脚本语言,处理数据和业务逻辑
本文深入探讨了PHP与Ajax在Web开发中的交互技术。PHP作为服务器端脚本语言,处理数据和业务逻辑;Ajax则通过异步请求实现页面无刷新更新。文中详细介绍了两者的工作原理、数据传输格式选择、具体实现方法及实际应用案例,如实时数据更新、表单验证与提交、动态加载内容等。同时,针对跨域问题、数据安全与性能优化提出了建议。总结指出,PHP与Ajax的结合能显著提升Web应用的效率和用户体验。
122 3
|
5月前
|
自然语言处理 编译器 应用服务中间件
PHP在服务器上的运行过程
PHP在服务器上的运行过程
114 7
|
5月前
|
监控 PHP Apache
优化 PHP-FPM 参数配置:实现服务器性能提升
优化PHP-FPM的参数配置可以显著提高服务器的性能和稳定性。通过合理设置 `pm.max_children`、`pm.start_servers`、`pm.min_spare_servers`、`pm.max_spare_servers`和 `pm.max_requests`等参数,并结合监控和调优措施,可以有效应对高并发和负载波动,确保Web应用程序的高效运行。希望本文提供的优化建议和配置示例能够帮助您实现服务器性能的提升。
240 3
|
5月前
|
PHP 开发者
PHP作为一门流行的服务器端脚本语言,深入理解PHP的命名空间
【10月更文挑战第22天】PHP作为一门流行的服务器端脚本语言,自1995年诞生以来,已经发展了二十多年。在这二十多年的时间里,PHP经历了多次重大版本的更新,不断增加新特性和改进。其中,命名空间(Namespace)是PHP 5.3.0引入的一个重要特性,它为PHP的代码组织和重用提供了一种新的方式。本文将从三个部分深入理解PHP的命名空间:一是命名空间的基本概念和作用;二是PHP命名空间的使用方法;三是通过实例讲解命名空间的应用。
51 4
|
PHP Android开发
《Android和PHP开发最佳实践 》一导读
本书的写作风格大众化,注重实用性,章节精心编排,讲解由浅入深,力求让读者能够在最快的时间内上手,同时也可以拓宽读者在移动互联网应用开发方面的思路。特别要指出的是,本书的代码实例都源自真实的项目,实用价值极高。
1335 0
|
关系型数据库 PHP Apache
《Android和PHP开发最佳实践 》一3.7 小结
本节书摘来自华章出版社《Android和PHP开发最佳实践 》一书中的第3章,第3.7节,作者 黄隽实,更多章节内容可以访问云栖社区“华章计算机”公众号查看
1564 0
|
JavaScript 前端开发 PHP
《Android和PHP开发最佳实践 》一3.6 开发框架简介
本节书摘来自华章出版社《Android和PHP开发最佳实践 》一书中的第3章,第3.6节,作者 黄隽实,更多章节内容可以访问云栖社区“华章计算机”公众号查看
1062 0
|
JavaScript 前端开发 PHP
《Android和PHP开发最佳实践 》一3.5 认识Smarty模板引擎
本节书摘来自华章出版社《Android和PHP开发最佳实践 》一书中的第3章,第3.5节,作者 黄隽实,更多章节内容可以访问云栖社区“华章计算机”公众号查看
1342 0

热门文章

最新文章

下一篇
oss创建bucket