碰巧的机会,把Android上传图片到Tomcat端的代码又学习了一遍,这里总结一下,分享经验。
Android端
1 Android中AsyncTask的使用,这个东西是比较重要的,要学会用。下面链接写得好。
https://blog.csdn.net/iispring/article/details/50639090
2 从相册中选择图片
//1 获取activity服务
Intent galleryIntent = new Intent(Intent.ACTION_PICK,
MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
//2 获取数据位置
Uri selectedImage = data.getData();
String[] filePathColumn = {MediaStore.Images.Media.DATA};
// 获取游标
Cursor cursor = getContentResolver().query(selectedImage, filePathColumn, null, null, null);
cursor.moveToFirst();
int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
imgPath = cursor.getString(columnIndex);
cursor.close();
// 3 根据路径获取,转化为File
file = new File(Environment.getExternalStorageDirectory(), filename +".png");
try {
FileOutputStream fos = new FileOutputStream(file);
try {
fos.write(stream.toByteArray());
fos.flush();
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
} catch (FileNotFoundException e) {
e.printStackTrace();
}
最后就是通过网络框架,将数据作为参数上传到服务器,即可。
这些操作都大同小异。
服务器端
服务端是通过Java的Servlet来实现的,里面使用了一些框架,总之效果不错。而感觉前台参数来获取文件的代码,主要是对FileItem进行遍历,找到需要的文件。
protected void service(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException
{
try
{
request.setCharacterEncoding("UTF-8"); // 设置处理请求参数的编码格式
response.setContentType("text/html;charset=UTF-8"); // 设置Content-Type字段值
PrintWriter out = response.getWriter();
// 下面的代码开始使用Commons-UploadFile组件处理上传的文件数据
FileItemFactory factory = new DiskFileItemFactory(); // 建立FileItemFactory对象
ServletFileUpload upload = new ServletFileUpload(factory);
// 分析请求,并得到上传文件的FileItem对象
List<FileItem> items = upload.parseRequest(request);
// 从web.xml文件中的参数中得到上传文件的路径
String uploadPath = "d:\\upload\\";
File file = new File(uploadPath);
if (!file.exists())
{
file.mkdir();
}
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 = 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对象
out.println("文件上传成功!");
}
}
catch (Exception e)
{
}
}
剩下也就没什么了,找个时间要好好总结一下之前做的服务端的知识。