Android上传文件到Web服务器,PHP接收文件

简介:  Android上传文件到服务器,通常采用构造http协议的方法,模拟网页POST方法传输文件,服务器端可以采用JavaServlet或者PHP来接收要传输的文件。

 Android上传文件到服务器,通常采用构造http协议的方法,模拟网页POST方法传输文件,服务器端可以采用JavaServlet或者PHP来接收要传输的文件。使用JavaServlet来接收文件的方法比较常见,在这里给大家介绍一个简单的服务器端使用PHP语言来接收文件的例子。

服务器端代码比较简单,接收传输过来的文件:

[php]  view plain  copy
  1. <?php  
  2. $target_path  = "./upload/";//接收文件目录  
  3. $target_path = $target_path . basename$_FILES['uploadedfile']['name']);  
  4. if(move_uploaded_file($_FILES['uploadedfile']['tmp_name'], $target_path)) {  
  5.    echo "The file ".  basename$_FILES['uploadedfile']['name']). " has been uploaded";  
  6. }  else{  
  7.    echo "There was an error uploading the file, please try again!" . $_FILES['uploadedfile']['error'];  
  8. }  
  9. ?>  

手机客户端代码:

[java]  view plain  copy
  1. package com.figo.uploadfile;  
  2.   
  3. import java.io.BufferedReader;  
  4. import java.io.DataOutputStream;  
  5. import java.io.FileInputStream;  
  6. import java.io.InputStream;  
  7. import java.io.InputStreamReader;  
  8. import java.net.HttpURLConnection;  
  9. import java.net.URL;  
  10. import android.app.Activity;  
  11. import android.os.Bundle;  
  12. import android.view.View;  
  13. import android.widget.Button;  
  14. import android.widget.TextView;  
  15. import android.widget.Toast;  
  16.   
  17. public class UploadfileActivity extends Activity  
  18. {  
  19.   // 要上传的文件路径,理论上可以传输任何文件,实际使用时根据需要处理  
  20.   private String uploadFile = "/sdcard/testimg.jpg";  
  21.   private String srcPath = "/sdcard/testimg.jpg";  
  22.   // 服务器上接收文件的处理页面,这里根据需要换成自己的  
  23.   private String actionUrl = "http://10.100.1.208/receive_file.php";  
  24.   private TextView mText1;  
  25.   private TextView mText2;  
  26.   private Button mButton;  
  27.   
  28.   @Override  
  29.   public void onCreate(Bundle savedInstanceState)  
  30.   {  
  31.     super.onCreate(savedInstanceState);  
  32.     setContentView(R.layout.main);  
  33.   
  34.     mText1 = (TextView) findViewById(R.id.myText2);  
  35.     mText1.setText("文件路径:\n" + uploadFile);  
  36.     mText2 = (TextView) findViewById(R.id.myText3);  
  37.     mText2.setText("上传网址:\n" + actionUrl);  
  38.     /* 设置mButton的onClick事件处理 */  
  39.     mButton = (Button) findViewById(R.id.myButton);  
  40.     mButton.setOnClickListener(new View.OnClickListener()  
  41.     {  
  42.       @Override  
  43.       public void onClick(View v)  
  44.       {  
  45.         uploadFile(actionUrl);  
  46.       }  
  47.     });  
  48.   }  
  49.   
  50.   /* 上传文件至Server,uploadUrl:接收文件的处理页面 */  
  51.   private void uploadFile(String uploadUrl)  
  52.   {  
  53.     String end = "\r\n";  
  54.     String twoHyphens = "--";  
  55.     String boundary = "******";  
  56.     try  
  57.     {  
  58.       URL url = new URL(uploadUrl);  
  59.       HttpURLConnection httpURLConnection = (HttpURLConnection) url  
  60.           .openConnection();  
  61.       // 设置每次传输的流大小,可以有效防止手机因为内存不足崩溃  
  62.       // 此方法用于在预先不知道内容长度时启用没有进行内部缓冲的 HTTP 请求正文的流。  
  63.       httpURLConnection.setChunkedStreamingMode(128 * 1024);// 128K  
  64.       // 允许输入输出流  
  65.       httpURLConnection.setDoInput(true);  
  66.       httpURLConnection.setDoOutput(true);  
  67.       httpURLConnection.setUseCaches(false);  
  68.       // 使用POST方法  
  69.       httpURLConnection.setRequestMethod("POST");  
  70.       httpURLConnection.setRequestProperty("Connection""Keep-Alive");  
  71.       httpURLConnection.setRequestProperty("Charset""UTF-8");  
  72.       httpURLConnection.setRequestProperty("Content-Type",  
  73.           "multipart/form-data;boundary=" + boundary);  
  74.   
  75.       DataOutputStream dos = new DataOutputStream(  
  76.           httpURLConnection.getOutputStream());  
  77.       dos.writeBytes(twoHyphens + boundary + end);  
  78.       dos.writeBytes("Content-Disposition: form-data; name=\"uploadedfile\"; filename=\""  
  79.           + srcPath.substring(srcPath.lastIndexOf("/") + 1)  
  80.           + "\""  
  81.           + end);  
  82.       dos.writeBytes(end);  
  83.   
  84.       FileInputStream fis = new FileInputStream(srcPath);  
  85.       byte[] buffer = new byte[8192]; // 8k  
  86.       int count = 0;  
  87.       // 读取文件  
  88.       while ((count = fis.read(buffer)) != -1)  
  89.       {  
  90.         dos.write(buffer, 0, count);  
  91.       }  
  92.       fis.close();  
  93.   
  94.       dos.writeBytes(end);  
  95.       dos.writeBytes(twoHyphens + boundary + twoHyphens + end);  
  96.       dos.flush();  
  97.   
  98.       InputStream is = httpURLConnection.getInputStream();  
  99.       InputStreamReader isr = new InputStreamReader(is, "utf-8");  
  100.       BufferedReader br = new BufferedReader(isr);  
  101.       String result = br.readLine();  
  102.   
  103.       Toast.makeText(this, result, Toast.LENGTH_LONG).show();  
  104.       dos.close();  
  105.       is.close();  
  106.   
  107.     } catch (Exception e)  
  108.     {  
  109.       e.printStackTrace();  
  110.       setTitle(e.getMessage());  
  111.     }  
  112.   }  
  113. }  

在AndroidManifest.xml文件里添加网络访问权限:

[plain]  view plain  copy
  1. <uses-permission android:name="android.permission.INTERNET" />  

运行结果:



目录
相关文章
|
移动开发 安全 Java
Android历史版本与APK文件结构
通过以上内容,您可以全面了解Android的历史版本及其主要特性,同时掌握APK文件的结构和各部分的作用。这些知识对于理解Android应用的开发和发布过程非常重要,也有助于在实际开发中进行高效的应用管理和优化。希望这些内容对您的学习和工作有所帮助。
1785 83
|
Android开发 开发者
Android自定义View之不得不知道的文件attrs.xml(自定义属性)
本文详细介绍了如何通过自定义 `attrs.xml` 文件实现 Android 自定义 View 的属性配置。以一个包含 TextView 和 ImageView 的 DemoView 为例,讲解了如何使用自定义属性动态改变文字内容和控制图片显示隐藏。同时,通过设置布尔值和点击事件,实现了图片状态的切换功能。代码中展示了如何在构造函数中解析自定义属性,并通过方法 `setSetting0n` 和 `setbackeguang` 实现功能逻辑的优化与封装。此示例帮助开发者更好地理解自定义 View 的开发流程与 attrs.xml 的实际应用。
414 2
Android自定义View之不得不知道的文件attrs.xml(自定义属性)
|
Java Android开发
Android studio中build.gradle文件简单介绍
本文解析了Android项目中build.gradle文件的作用,包括jcenter仓库配置、模块类型定义、包名设置及依赖管理,涵盖本地、库和远程依赖的区别。
1097 19
|
存储 XML Java
Android 文件数据储存之内部储存 + 外部储存
简介:本文详细介绍了Android内部存储与外部存储的使用方法及核心原理。内部存储位于手机内存中,默认私有,适合存储SharedPreferences、SQLite数据库等重要数据,应用卸载后数据会被清除。外部存储包括公共文件和私有文件,支持SD卡或内部不可移除存储,需申请权限访问。文章通过代码示例展示了如何保存、读取、追加、删除文件以及将图片保存到系统相册的操作,帮助开发者理解存储机制并实现相关功能。
3085 2
|
SQL 敏捷开发 安全
PHP 的精髓:灵活高效,为 Web 而生
PHP 的精髓:灵活高效,为 Web 而生
|
应用服务中间件 PHP nginx
当你的nginx服务器和php服务器不在一起的时候,这个nginx 的root目录问题
两个服务器的网站代码目录需要对齐,docker容器里面也是一样
|
自然语言处理 编译器 应用服务中间件
PHP在服务器上的运行过程
PHP在服务器上的运行过程
388 7
|
SQL 安全 前端开发
PHP与现代Web开发:构建高效的网络应用
【10月更文挑战第37天】在数字化时代,PHP作为一门强大的服务器端脚本语言,持续影响着Web开发的面貌。本文将深入探讨PHP在现代Web开发中的角色,包括其核心优势、面临的挑战以及如何利用PHP构建高效、安全的网络应用。通过具体代码示例和最佳实践的分享,旨在为开发者提供实用指南,帮助他们在不断变化的技术环境中保持竞争力。
|
XML 前端开发 JavaScript
PHP与Ajax在Web开发中的交互技术。PHP作为服务器端脚本语言,处理数据和业务逻辑
本文深入探讨了PHP与Ajax在Web开发中的交互技术。PHP作为服务器端脚本语言,处理数据和业务逻辑;Ajax则通过异步请求实现页面无刷新更新。文中详细介绍了两者的工作原理、数据传输格式选择、具体实现方法及实际应用案例,如实时数据更新、表单验证与提交、动态加载内容等。同时,针对跨域问题、数据安全与性能优化提出了建议。总结指出,PHP与Ajax的结合能显著提升Web应用的效率和用户体验。
431 3
|
PHP 开发者
深入浅出PHP:构建你的第一个Web应用
【10月更文挑战第35天】在数字时代的浪潮中,掌握编程技能已成为通往未来的钥匙。本文将带你从零开始,一步步走进PHP的世界,解锁创建动态网页的魔法。通过浅显易懂的语言和实际代码示例,我们将共同打造一个简单但功能强大的Web应用。无论你是编程新手还是希望扩展技能的老手,这篇文章都将是你的理想选择。让我们一起探索PHP的魅力,开启你的编程之旅!
227 5