安卓客户端与服务器间文件的下载与上传

时间:2021-08-20 03:59:55

        本人最近在写一个安卓应用,里面涉及到用户头像的下载与上传,这也是当下每一个涉及到账户的安卓客户端基本都要实现的功能,当然方法肯定有很多种,本文就介绍下我的实现方法,与大家一起学习。服务器部分是用servlet实现的,架构在Tomcat之上,本文将分为文件下载与上传两个部分。

        首先是文件从服务器下载部分。将要下载的部分直接扔在Tomcat安装目录下webapps文件夹中的ROOT文件夹中,比如本人的路径是G:\Tomcat\webapps\ROOT。然后本地ip为114.212.81.120,Tomcat使用的端口为8001(端口和ip都是因人而异的),那么可以设置访问的url为“http://114.212.81.120:8001/文件名”,浏览器访问这个url也可以直接下载。自己写代码的话可以通过url先创建输入流,根据本地文件路径创建输出流,然后使用缓冲进行下载,不至于占用太多内存。比如如下代码的功能是下载一个图片touxiang.png,这个文件路径为"G:\Tomcat\webapps\ROOT\touxiang.png",具体过程已经注释很清楚了。

    String localpath = Environment.getExternalStorageDirectory()+"/downloalimg/";//先创建本地文件夹
File folder = new File(localpath);//文件夹
if(!folder.exists())//确保本地有文件夹
folder.mkdir();
//如果图片已经存在,删除之后更新
String filepath = localpath + "touxiang.png";
File file = new File(filepath);
if(file.exists())
file.delete();
URL url = new URL("http://114.212.81.120:8001/touxiang.png");
URLConnection con = url.openConnection();
InputStream is = con.getInputStream();//创建输入流
byte[] bs = new byte[1024];//创建1k的数据缓冲流
int len;//读取到的数据长度
OutputStream os = new FileOutputStream(file);//创建输出流
while((len = is.read(bs)) != -1)
os.write(bs, 0, len);
os.close();
is.close();
        然后是文件上传服务器,同样文件准备直接上传到Tomcat安装目录下webapps文件夹中的ROOT文件夹,本人的路径为G:\Tomcat\webapps\ROOT,ip和端口也和前面的一样一样的。创建的网络项目名称为ServletUploadDemo,那么在servlet中,比如servlet的文件名为UploadServlet,那么客户端连接服务器的url可以为"http://114.212.81.120:8001/ServletUpLoadDemo/UploadServlet"。客户端的代码如下,要上传的文件为##touxiang.png:

    private String end = "\r\n";
private String twoHyphens = "--";
private String boundary = "******";
URL url = new URL("http://114.212.81.120:8001/ServletUpLoadDemo/UploadServlet");
HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();
httpURLConnection.setDoInput(true);//下面是一些连接属性的设置
httpURLConnection.setDoOutput(true);
httpURLConnection.setUseCaches(false);
httpURLConnection.setRequestMethod("POST");
httpURLConnection.setRequestProperty("Connection", "Keep-Alive");
httpURLConnection.setRequestProperty("Charset", "UTF-8");
httpURLConnection.setRequestProperty("Content-Type", "multipart/form-data;boundary=" + boundary);
httpURLConnection.connect();//这一句可以不写,因为下一句中的httpURLConnection.getOutputStream()包含了connect()的过程
DataOutputStream dos = new DataOutputStream(httpURLConnection.getOutputStream());
dos.writeBytes(twoHyphens + boundary + end);
dos.writeBytes("Content-Disposition: form-data; name=\"file\"; filename=\""
+ "##touxiang.png"
+ "\"" + end);
dos.writeBytes(end);
FileInputStream fis = new FileInputStream(Environment.getExternalStorageDirectory()+"/downloalimg/##touxiang.png");
byte[] buffer = new byte[1024]; //缓冲区1k
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();
//再调用下边的getInputStream()函数时才将内存缓冲区中封装好的完整的HTTP请求电文发送到服务端
InputStream is = httpURLConnection.getInputStream();//这句话一定要写,不然会发现根本和servlet都没有交互
dos.close();
is.close();
对应服务器对应的代码如下,其中doPost()为override的一个函数,
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
try {
request.setCharacterEncoding("UTF-8"); // 设置处理请求参数的编码格式
// 下面的代码开始使用Commons-UploadFile组件处理上传的文件数据
FileItemFactory factory = new DiskFileItemFactory(); // 建立FileItemFactory对象
ServletFileUpload upload = new ServletFileUpload(factory);
// 分析请求,并得到上传文件的FileItem对象
List<FileItem> items = upload.parseRequest(request);
String filename = ""; // 上传文件保存到服务器的文件名
InputStream is = null; // 当前上传文件的InputStream对象
// 循环处理上传文件
for (FileItem item : items) {
// 处理普通的表单域
if (item.isFormField()) {
if (item.getFieldName().equals("filename")) {
// 如果新文件不为空,将其保存在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);
is = item.getInputStream(); // 得到上传文件的InputStream对象
}
}
//对filename进行提取: "##touxiang.png" 提取出文件名touxiang.png
filename = filename.substring(2);
// 将路径和上传文件名组合成完整的服务端路径
String uploadpath = "G:\\Tomecat\\webapps\\ROOT\\";
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对象
}
}
catch (Exception e) {}
}
当然上传或者下载的文件也不一定要存在"G:\Tomcat\webapps\ROOT\"下,也可以放在ROOT下的某个文件夹中。