Android(java)学习笔记157:开源框架的文件上传(只能使用Post)

时间:2021-07-30 17:07:04

1.文件上传给服务器,服务器端必然要写代码进行支持,如下:

我们新建一个FileUpload.jsp的动态网页,同时我们上传文件只能使用post方式(不可能将上传数据拼凑在url路径下),上传数据Apache给我们提供了完善的框架,我们只要引入commons-fileupload-1.2.2.jar  和  commons-io-2.0.1.jar就可以使用这个Apache给我们封装好的框架,这两个jar放到如下目录下:

WebContent/WEB-INF/lib/

引入jar包之后,接下来我们新建一个Servlet程序,命名为"UploadServlet.java",整个工程如下图:

Android(java)学习笔记157:开源框架的文件上传(只能使用Post)

 

 

2.PC端上传数据到服务器:

编写服务器端代码UploadServlet.java代码:

 package com.himi.web;

 import java.io.File;
import java.io.IOException;
import java.util.List; import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileItemFactory;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload; /**
* Servlet implementation class UploadServlet
*/
@WebServlet("/UploadServlet")
public class UploadServlet extends HttpServlet {
private static final long serialVersionUID = 1L; /**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
// 判断上传数据是否包含文件,true--包含文件,false--不包含文件
boolean isMultipart = ServletFileUpload.isMultipartContent(request);
//如果上传数据包含文件
if (isMultipart) {
//获取servlet上下文真实的路径
String realpath = request.getSession().getServletContext()
.getRealPath("/files");
//打印servlet上下文真实的路径给用户观察
System.out.println(realpath);
File dir = new File(realpath);
if (!dir.exists())
dir.mkdirs();
//public DiskFileItemFactory()://创建一个基于硬盘的FileItem工厂。
FileItemFactory factory = new DiskFileItemFactory();
//创建一个文件上传处理器  
ServletFileUpload upload = new ServletFileUpload(factory);
upload.setHeaderEncoding("UTF-8");
try {
//工具类ServletFileUpload解析我们的http的post请求的参数数据,解析结果赋给一个List集合
//List集合中是我们form(jsp)标签中我们的每个input节点的数据
List<FileItem> items = upload.parseRequest(request);
for (FileItem item : items) {
//如果是一个普通的表单
if (item.isFormField()) {
String name1 = item.getFieldName();// 得到请求参数的名称
String value = item.getString("UTF-8");// 得到参数值
System.out.println(name1 + "=" + value);
} else {//如果里面有文件数据,就把文件写到当前servlet上下文真实路径里面,文件名称是以系统事件命名的
item.write(new File(dir, System.currentTimeMillis()
+ item.getName().substring(
item.getName().lastIndexOf("."))));
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
} }

同时我们还要编写FileUpload.jsp代码如下:

 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>???????</title>
</head>
<body> <form action="UploadServlet" method="post" enctype="multipart/form-data">
请选择文件上传<input type="file" name="file"> <br>
<input type="submit" value="提交"> <br>
</form> </body>
</html>

运行FileUpload.jsp动态页面在Tomcat服务器上,显示效果如下:

Android(java)学习笔记157:开源框架的文件上传(只能使用Post)

 

复制路径http://localhost:8080/web/FileUpload.jsp到360浏览器上,如下:

Android(java)学习笔记157:开源框架的文件上传(只能使用Post)

 

这里我们选择文件为桌面上的一个 心得.txt ,我们提交之后,观察浏览器 和 服务器反应,如下:

浏览器的反应:

Android(java)学习笔记157:开源框架的文件上传(只能使用Post)

 

 

Android(java)学习笔记157:开源框架的文件上传(只能使用Post)

 

服务器的反应:

Android(java)学习笔记157:开源框架的文件上传(只能使用Post)

 

 

 

追溯到这个打印出来的路径,我们找到了我们上传的文件,如下:

Android(java)学习笔记157:开源框架的文件上传(只能使用Post)

 

打开文件,文件内容是对的。

到这里说明PC到服务器端的文件上传是没有问题的。

 

3.Android手机客户端上传数据到服务器:

(1)我们新建一个Android工程,如下,命名为"文件上传器",工程一览图如下:

Android(java)学习笔记157:开源框架的文件上传(只能使用Post)

 

 

(2)复制loopj/android-async-http的Http开源框架到项目中:

Android(java)学习笔记157:开源框架的文件上传(只能使用Post)

 

(3)布局文件activity_main.xml:

 <LinearLayout 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:orientation="vertical"
tools:context="com.himi.upload.MainActivity" > <EditText
android:id="@+id/et_path"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:hint="请输入要上传文件的路径" /> <Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:onClick="upload"
android:text="上传" /> <ProgressBar
android:id="@+id/progressBar1"
style="?android:attr/progressBarStyleHorizontal"
android:layout_width="fill_parent"
android:layout_height="wrap_content" /> </LinearLayout>

布局效果如下:

Android(java)学习笔记157:开源框架的文件上传(只能使用Post)

 

(4)同时MainActivity.java:

 package com.himi.upload;

 import java.io.File;
import java.io.FileNotFoundException; import org.apache.http.Header; import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;
import android.widget.ProgressBar;
import android.widget.Toast; import com.loopj.android.http.AsyncHttpClient;
import com.loopj.android.http.AsyncHttpResponseHandler;
import com.loopj.android.http.RequestParams; public class MainActivity extends Activity {
private EditText et_path;
private ProgressBar progressBar1; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
et_path = (EditText) findViewById(R.id.et_path);
progressBar1 = (ProgressBar) findViewById(R.id.progressBar1);
} public void upload(View view) {
String path = et_path.getText().toString().trim();
File file = new File(path);
if(file.exists()) {
String serverurl = getString(R.string.server);
AsyncHttpClient client = new AsyncHttpClient();
RequestParams params = new RequestParams();
try {
params.put("file", file);
} catch (FileNotFoundException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}//Upload a File client.post(serverurl, params, new AsyncHttpResponseHandler() { @Override
public void onSuccess(int statusCode, Header[] headers, byte[] responseBody) {
Toast.makeText(MainActivity.this, "上传成功", 0).show(); } /**
* bytesWritten:当前进度
* totalSize:总进度
*/
@Override
public void onProgress(int bytesWritten, int totalSize) {
progressBar1.setMax(totalSize);
progressBar1.setProgress(bytesWritten);
super.onProgress(bytesWritten, totalSize);
} @Override
public void onFailure(int statusCode, Header[] headers,
byte[] responseBody, Throwable error) {
Toast.makeText(MainActivity.this, "上传失败", 0).show(); }
}); }else {
Toast.makeText(this, "文件不存在,请检查路径", 0).show();
}
}
}

在模拟器文件的文件目录,存储imgs.jpg图片文件在目录/data/imgs.ipg,如下:

Android(java)学习笔记157:开源框架的文件上传(只能使用Post)

 

然后布署程序到模拟器上,输入上面imgs.jpg文件的存在目录,点击"上传",提示"上传成功"土司:

Android(java)学习笔记157:开源框架的文件上传(只能使用Post)

 

(5)这时候服务器端出现提示信息,说明我们已经上传成功了,这个提示信息是上传文件的存放的位置:

Android(java)学习笔记157:开源框架的文件上传(只能使用Post)

 

追溯到这个目录下,我们看到了我们之前上传的imgs.jpg图片,只是这里重新以系统时间进行命名了,如下:

Android(java)学习笔记157:开源框架的文件上传(只能使用Post)