这里实现的效果是:用户在客户端首先点击按钮进行选择图片,当图片选中之后,就会显示在ImageView中,并且在此时将图片上传至服务器。
这里并没有对图片和数据库进行相关联,如果愿意,可以在数据库中建立相应的字段,将图片的存放地址保存即可。
当然在AndroidManifest.xml中的权限还要加上,这里不再赘述。
首先先定义activity_main.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context=".MainActivity" > <Button android:id="@+id/ShowImg" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/ShowImg" /> <ImageView android:id="@+id/Img" android:layout_below="@id/ShowImg" android:layout_width="wrap_content" android:layout_height="wrap_content"/> </RelativeLayout>
接着进行客户端代码的编写:这里要进行的操作就是先选择图片然后再进行上传
MainActivity.java
package com.demo.imgshowpro; import java.io.File; import java.io.FileNotFoundException; import java.io.IOException; import android.app.Activity; import android.content.ContentResolver; import android.content.Intent; import android.database.Cursor; import android.net.Uri; import android.os.Bundle; import android.provider.MediaStore; import android.view.Menu; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.ImageView; public class MainActivity extends Activity { private Button showImg = null; private ImageView img = null; private static final String IMG_TYPE = "image/*"; private static final int IMG_CODE = 0; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); showImg = (Button) findViewById(R.id.ShowImg); img = (ImageView) findViewById(R.id.Img); showImg.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(Intent.ACTION_GET_CONTENT); intent.setType(IMG_TYPE); startActivityForResult(intent, IMG_CODE); } }); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { // RESULT_OK为系统定义的常量 if(resultCode != RESULT_OK) { return; } ContentResolver resolver = getContentResolver(); if (resultCode == RESULT_OK) { // 获取图片uri Uri uri = data.getData(); try { // 显示到bitmap图片 MediaStore.Images.Media.getBitmap(resolver, uri); // 获取图片的路径 String[] proj = new String[]{MediaStore.Images.Media.DATA}; Cursor cursor = managedQuery(uri, proj, null, null, null); int index = cursor.getColumnIndex(MediaStore.Images.Media.DATA); cursor.moveToFirst(); // 根据索引值获取图片路径 String path = cursor.getString(index); // ImageView里面打印图片 img.setImageURI(uri); // 图片上传服务器 File file =new File(path); Upload upload = new Upload(); upload.uploadFile(file); // 输出本文件存在的位置 System.out.println(path); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } }
上文中使用的上传图片的类Upload如下:
package com.demo.imgshowpro; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.net.Socket; import java.net.UnknownHostException; import android.annotation.SuppressLint; import android.os.Build; import android.os.StrictMode; @SuppressLint("NewApi") public class Upload { // 这里的地址为HOME private static final String HOME = "192.168.X.XXX"; private static final String BUFF = "--"; Socket socket = null; DataOutputStream output = null; DataInputStream input = null; public void uploadFile(File file) { // 如果本系统为4.0以上(Build.VERSION_CODES.ICE_CREAM_SANDWICH为android4.0) if (Build.VERSION.SDK_INT > Build.VERSION_CODES.ICE_CREAM_SANDWICH) { // 详见StrictMode文档 StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder() .detectDiskReads().detectDiskWrites().detectNetwork() .penaltyLog().build()); StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder() .detectLeakedSqlLiteObjects().detectLeakedClosableObjects() .penaltyLog().penaltyDeath().build()); } try { // 连接服务器 socket = new Socket(HOME, 8888); // 得到输出流 output = new DataOutputStream(socket.getOutputStream()); // 得到如入流 input = new DataInputStream(socket.getInputStream()); /* 取得文件的FileInputStream */ FileInputStream fStream = new FileInputStream(file); String[] fileEnd = file.getName().split("\\."); output.writeUTF(BUFF + fileEnd[fileEnd.length - 1].toString()); System.out.println("buffer------------------" + BUFF + fileEnd[fileEnd.length - 1].toString()); //设置每次写入102400bytes int bufferSize = 102400; byte[] buffer = new byte[bufferSize]; int length = 0; // 从文件读取数据至缓冲区(值为-1说明已经读完) while ((length = fStream.read(buffer)) != -1) { /* 将资料写入DataOutputStream中 */ output.write(buffer, 0, length); } // 一定要加上这句,否则收不到来自服务器端的消息返回 socket.shutdownOutput(); /* close streams */ fStream.close(); output.flush(); /* 取得input内容 */ String msg = input.readUTF(); System.out.println("上传成功 文件位置为:" + msg); } catch (UnknownHostException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
至此,客户端的代码已经编写完毕,下来为SERVER端的代码:
SocketServer.java
/** * */ package com.demo.server; import java.io.BufferedOutputStream; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.net.ServerSocket; import java.net.Socket; import java.util.Date; /** * @author 段 * */ public class SocketServer { private static final String BUFF = "--"; // 存放图片文件夹 private final static String IMG_RECORD = "D:\\img_record"; // socket端口 private final static int PORT = 8888; /** * @param args */ public static void main(String[] args) { // ServerSocket的引用 ServerSocket ss = null; // socket的引用 Socket socket = null; DataInputStream input = null; DataOutputStream output = null; try { // 监听到8888端口 ss = new ServerSocket(PORT); System.out.println("已监听到" + PORT + "端口"); System.out.println(new Date().toString() + " \n 服务器已经启动..."); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } while (true) { try { // 等待客户端连接 访问ServerSocket实例的accept方法取得一个客户端Socket对象 socket = ss.accept(); if (socket == null || socket.isClosed()) continue; // 得到输入流 input = new DataInputStream(socket.getInputStream()); // 得到输出流 output = new DataOutputStream(socket.getOutputStream()); // 上传数据 String pathString = SocketUpLoad(input); output.writeUTF(pathString); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } finally { try { // 关闭输出流 if (output != null) { output.close(); } // 关闭输入流 if (input != null) { input.close(); } // 关闭Socket连接 if (socket != null) { socket.close(); } } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } } /** * 上传 * * @param input */ private static String SocketUpLoad(DataInputStream input) { String fileName = null; try { DataInputStream inputStream = input; // 读一个字符串 String msg = inputStream.readUTF(); String[] strings = msg.split(BUFF); System.out.println(strings[strings.length - 1]); // 文件名 fileName = System.currentTimeMillis() + "." + strings[strings.length - 1]; System.out.println(new Date().toString() + "\t 文件名为:" + fileName); // 创建目录 CreateDir(IMG_RECORD); // 将数据读写到文件中 BufferedOutputStream bo = new BufferedOutputStream( new FileOutputStream(new File( (IMG_RECORD + "\\" + fileName)))); int bytesRead = 0; byte[] buffer = new byte[102400]; while ((bytesRead = inputStream.read(buffer, 0, buffer.length)) != -1) { bo.write(buffer, 0, bytesRead); } // 关闭 bo.flush(); bo.close(); System.out.println(new Date().toString() + "\t 数据接收完毕"); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } return IMG_RECORD + "\\" + fileName; } /** * 创建目录(不存在则创建) * @param dir * @return */ public static File CreateDir(String dir) { File file = new File(dir); if (!file.exists()) { file.mkdirs(); } return file; } }
当选择图片之后,服务端的图片可在D:\img_record文件夹下查找。