Android上传文件到Web服务器,PHP接收文件
来源:互联网 发布:js字符串转换为日期 编辑:程序博客网 时间:2024/05/16 12:25
Android上传文件到服务器,通常采用构造http协议的方法,模拟网页POST方法传输文件,服务器端可以采用JavaServlet或者PHP来接收要传输的文件。使用JavaServlet来接收文件的方法比较常见,在这里给大家介绍一个简单的服务器端使用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'];
- }
- ?>
手机客户端代码:
- package com.figo.uploadfile;
- import java.io.BufferedReader;
- import java.io.DataOutputStream;
- import java.io.FileInputStream;
- import java.io.InputStream;
- import java.io.InputStreamReader;
- import java.net.HttpURLConnection;
- import java.net.URL;
- import android.app.Activity;
- import android.os.Bundle;
- import android.view.View;
- import android.widget.Button;
- import android.widget.TextView;
- import android.widget.Toast;
- public class UploadfileActivity extends Activity
- {
- // 要上传的文件路径,理论上可以传输任何文件,实际使用时根据需要处理
- private String uploadFile = "/sdcard/testimg.jpg";
- private String srcPath = "/sdcard/testimg.jpg";
- // 服务器上接收文件的处理页面,这里根据需要换成自己的
- private String actionUrl = "http://10.100.1.208/receive_file.php";
- private TextView mText1;
- private TextView mText2;
- private Button mButton;
- @Override
- public void onCreate(Bundle savedInstanceState)
- {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- mText1 = (TextView) findViewById(R.id.myText2);
- mText1.setText("文件路径:\n" + uploadFile);
- mText2 = (TextView) findViewById(R.id.myText3);
- mText2.setText("上传网址:\n" + actionUrl);
- /* 设置mButton的onClick事件处理 */
- mButton = (Button) findViewById(R.id.myButton);
- mButton.setOnClickListener(new View.OnClickListener()
- {
- @Override
- public void onClick(View v)
- {
- uploadFile(actionUrl);
- }
- });
- }
- /* 上传文件至Server,uploadUrl:接收文件的处理页面 */
- 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 请求正文的流。
- 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);
- 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();
- 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());
- }
- }
- }
在AndroidManifest.xml文件里添加网络访问权限:
- <uses-permission android:name="android.permission.INTERNET" /
运行结果:
接上一篇文章《Android上传文件到Web服务器,PHP接收文件(一)》 http://www.linuxidc.com/Linux/2012-02/54985.htm,这次在之前的基础上添加进度显示,Java代码如下所示:
- package com.lenovo.uptest;
- import java.io.DataInputStream;
- import java.io.DataOutputStream;
- import java.io.File;
- import java.io.FileInputStream;
- import java.net.HttpURLConnection;
- import java.net.URL;
- import android.app.Activity;
- import android.app.AlertDialog;
- import android.app.ProgressDialog;
- import android.content.DialogInterface;
- import android.os.AsyncTask;
- import android.os.Bundle;
- import android.view.View;
- import android.widget.Button;
- import android.widget.TextView;
- public class UploadtestActivity extends Activity {
- /** Called when the activity is first created. */
- /**
- * Upload file to web server with progress status, client: android;
- * server:php
- * **/
- private TextView mtv1 = null;
- private TextView mtv2 = null;
- private Button bupload = null;
- private String uploadFile = "/sdcard/testimg.jpg";
- private String actionUrl = "http://10.100.1.208/receive_file.php";
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- mtv1 = (TextView) findViewById(R.id.mtv1);
- mtv1.setText("文件路径:\n" + uploadFile);
- mtv2 = (TextView) findViewById(R.id.mtv2);
- mtv2.setText("上传地址:\n" + actionUrl);
- bupload = (Button) findViewById(R.id.bupload);
- bupload.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- // TODO Auto-generated method stub
- FileUploadTask fileuploadtask = new FileUploadTask();
- fileuploadtask.execute();
- }
- });
- }
- // show Dialog method
- private void showDialog(String mess) {
- new AlertDialog.Builder(UploadtestActivity.this).setTitle("Message")
- .setMessage(mess)
- .setNegativeButton("确定", new DialogInterface.OnClickListener() {
- @Override
- public void onClick(DialogInterface dialog, int which) {
- }
- }).show();
- }
- class FileUploadTask extends AsyncTask<Object, Integer, Void> {
- private ProgressDialog dialog = null;
- HttpURLConnection connection = null;
- DataOutputStream outputStream = null;
- DataInputStream inputStream = null;
- //the file path to upload
- String pathToOurFile = "/sdcard/testimg.jpg";
- //the server address to process uploaded file
- String urlServer = "http://10.100.1.208/receive_file.php";
- String lineEnd = "\r\n";
- String twoHyphens = "--";
- String boundary = "*****";
- File uploadFile = new File(pathToOurFile);
- long totalSize = uploadFile.length(); // Get size of file, bytes
- @Override
- protected void onPreExecute() {
- dialog = new ProgressDialog(UploadtestActivity.this);
- dialog.setMessage("正在上传...");
- dialog.setIndeterminate(false);
- dialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
- dialog.setProgress(0);
- dialog.show();
- }
- @Override
- protected Void doInBackground(Object... arg0) {
- long length = 0;
- int progress;
- int bytesRead, bytesAvailable, bufferSize;
- byte[] buffer;
- int maxBufferSize = 256 * 1024;// 256KB
- try {
- FileInputStream fileInputStream = new FileInputStream(new File(
- pathToOurFile));
- URL url = new URL(urlServer);
- connection = (HttpURLConnection) url.openConnection();
- // Set size of every block for post
- connection.setChunkedStreamingMode(256 * 1024);// 256KB
- // Allow Inputs & Outputs
- connection.setDoInput(true);
- connection.setDoOutput(true);
- connection.setUseCaches(false);
- // Enable POST method
- connection.setRequestMethod("POST");
- connection.setRequestProperty("Connection", "Keep-Alive");
- connection.setRequestProperty("Charset", "UTF-8");
- connection.setRequestProperty("Content-Type",
- "multipart/form-data;boundary=" + boundary);
- outputStream = new DataOutputStream(
- connection.getOutputStream());
- outputStream.writeBytes(twoHyphens + boundary + lineEnd);
- outputStream
- .writeBytes("Content-Disposition: form-data; name=\"uploadedfile\";filename=\""
- + pathToOurFile + "\"" + lineEnd);
- outputStream.writeBytes(lineEnd);
- bytesAvailable = fileInputStream.available();
- bufferSize = Math.min(bytesAvailable, maxBufferSize);
- buffer = new byte[bufferSize];
- // 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);
- // Responses from the server (code and message)
- int serverResponseCode = connection.getResponseCode();
- String serverResponseMessage = connection.getResponseMessage();
- /* 将Response显示于Dialog */
- // Toast toast = Toast.makeText(UploadtestActivity.this, ""
- // + serverResponseMessage.toString().trim(),
- // Toast.LENGTH_LONG);
- // showDialog(serverResponseMessage.toString().trim());
- /* 取得Response内容 */
- // InputStream is = connection.getInputStream();
- // int ch;
- // StringBuffer sbf = new StringBuffer();
- // while ((ch = is.read()) != -1) {
- // sbf.append((char) ch);
- // }
- //
- // showDialog(sbf.toString().trim());
- fileInputStream.close();
- outputStream.flush();
- outputStream.close();
- } catch (Exception ex) {
- // Exception handling
- // showDialog("" + ex);
- // Toast toast = Toast.makeText(UploadtestActivity.this, "" +
- // ex,
- // Toast.LENGTH_LONG);
- }
- return null;
- }
- @Override
- protected void onProgressUpdate(Integer... progress) {
- dialog.setProgress(progress[0]);
- }
- @Override
- protected void onPostExecute(Void result) {
- try {
- dialog.dismiss();
- // TODO Auto-generated method stub
- } catch (Exception e) {
- }
- }
- }
- }
服务器端仍然和之前的一样。
这里使用了AsyncTask,它使创建需要与用户界面交互的长时间运行的任务变得更简单,适用于简单的异步处理,不需要借助线程和Handler即可实现。
AsyncTask是抽象类.AsyncTask定义了三种泛型类型 Params,Progress和Result。
Params 启动任务执行的输入参数,比如HTTP请求的URL。
Progress 后台任务执行的百分比。
Result 后台执行任务最终返回的结果,比如String。
AsyncTask的执行分为四个步骤,每一步都对应一个回调方法,这些方法不应该由应用程序调用,开发者需要做的就是实现这些方法。
1) 子类化AsyncTask
2) 实现AsyncTask中定义的下面一个或几个方法
onPreExecute(), 该方法将在执行实际的后台操作前被UI thread调用。可以在该方法中做一些准备工作,如在界面上显示一个进度条。
doInBackground(Params...), 将在onPreExecute 方法执行后马上执行,该方法运行在后台线程中。这里将主要负责执行那些很耗时的后台计算工作。可以调用 publishProgress方法来更新实时的任务进度。该方法是抽象方法,子类必须实现。
onProgressUpdate(Progress...),在publishProgress方法被调用后,UI thread将调用这个方法从而在界面上展示任务的进展情况,例如通过一个进度条进行展示。
onPostExecute(Result), 在doInBackground 执行完成后,onPostExecute 方法将被UI thread调用,后台的计算结果将通过该方法传递到UI thread.
为了正确的使用AsyncTask类,以下是几条必须遵守的准则:
1) Task的实例必须在UI thread中创建
2) execute方法必须在UI thread中调用
3) 不要手动的调用onPreExecute(), onPostExecute(Result),doInBackground(Params...), onProgressUpdate(Progress...)这几个方法
4) 该task只能被执行一次,否则多次调用时将会出现异常
doInBackground方法和onPostExecute的参数必须对应,这两个参数在AsyncTask声明的���型参数列表中指定,第一个为doInBackground接受的参数,第二个为显示进度的参数,第三个为doInBackground返回和onPostExecute传入的参数。
运行结果如下:
- Android上传文件到Web服务器,PHP接收文件
- Android上传文件到Web服务器,PHP接收文件
- Android上传文件到Web服务器,PHP接收文件(一)
- Android上传文件到Web服务器,PHP接收文件(二)
- [置顶] Android上传文件到Web服务器,PHP接收文件(一)
- Android上传文件到Web服务器,PHP接收文件(2)
- Android上传文件到Web服务器,PHP接收文件(一)
- Android上传文件到Web服务器,PHP接收文件(二)
- Android上传文件到Web服务器,PHP接收文件(一)
- Android上传文件到Web服务器,PHP接收文件(一)
- Android上传文件到Web服务器,PHP接收文件(二)
- Android上传文件到Web服务器,PHP接收文件(一)
- android上传文件和参数到web服务器,php接收并保存
- android上传文件php服务器接收代码
- android 上传图片到web服务器,php负责接收
- Android端上传文件到Web服务器
- 利用HTTP协议实现Android文件上传至WEB服务器,采用PHP接收文件(参考网上自己实现)
- php 上传文件到服务器
- MinGW安装过程
- TestNG入门_webDriver+java(二)
- 如何在默认安装openjdk的Linux系统中安装独立JDK
- Web前端知识点总结(一)
- 在有openJDK的情况下,安装官方JDK,并改为默认
- Android上传文件到Web服务器,PHP接收文件
- 如何在自定义的ViewController加载Storyboard里面的ViewController
- 053第401题
- Nginx源代码分析之upstream(八)
- CLRS 2.2分析算法
- Java Web开发之:ModelDriven
- Tarjan算法求至少要添加几条边才能使无向连通图变为边双连通图。
- iOS写出文件
- 纯粹的K12精髓 - 名师指导整理《20以内加法口诀表》