想实现一个服务器端,能够接受安卓端上传的文字和图片数据,并保存。
实现方法是J2EE+servlet+Tomcat。
- 配置环境
参考:http://www.runoob.com/jsp/eclipse-jsp.html - 代码
uploadFile.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>文件上传实例 - 菜鸟教程</h1>
<form method="post" action="UploadFile" enctype="multipart/form-data">
选择一个文件:
<input type="file" name="uploadFile" />
<br/><br/>
<input type="submit" value="上传" />
</form>
</body>
</html>
UploadFile.java
package com.aiator.skin;
import java.io.IOException;
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 java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.util.List;
import java.util.UUID;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadBase;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
/**
* Servlet implementation class UploadServlet
*/
@WebServlet("/UploadFile")
public class UploadFile extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public UploadFile() {
super();
// TODO Auto-generated constructor stub
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
//response.getWriter().append("Served at: ").append(request.getContextPath());
try {
System.out.println("IP:" + request.getRemoteAddr());
// 1、创建工厂类:DiskFileItemFactory
DiskFileItemFactory facotry = new DiskFileItemFactory();
String tempDir = getServletContext().getRealPath("/WEB-INF/temp");
System.out.println("tempDir:" + tempDir);
facotry.setRepository(new File(tempDir));//设置临时文件存放目录
// 2、创建核心解析类:ServletFileUpload
ServletFileUpload upload = new ServletFileUpload(facotry);
upload.setHeaderEncoding("UTF-8");// 解决上传的文件名乱码
upload.setFileSizeMax(1024 * 1024 * 1024);// 单个文件上传最大值是1M
upload.setSizeMax(2048 * 1024 * 1024);//文件上传的总大小限制
// 3、判断用户的表单提交方式是不是multipart/form-data
boolean bb = upload.isMultipartContent(request);
if (!bb) {
System.out.println("not multipart/form-data");
return;
}
// 4、是:解析request对象的正文内容List<FileItem>
List<FileItem> items = upload.parseRequest(request);
String storePath = getServletContext().getRealPath(
"/WEB-INF/upload");// 上传的文件的存放目录
System.out.println(storePath);
for (FileItem item : items) {
if (item.isFormField()) {
// 5、判断是否是普通表单:打印看看。isFormField方法用于判断FileItem类对象封装的数据是一个普通文本表单字段,还是一个文件表单字段,如果是普通表单字段则返回true,否则返回false。因此,可以使用该方法判断是否为普通表单域,还是文件上传表单域。
String fieldName = item.getFieldName();// 请求参数名。getFieldName方法用于返回表单标签name属性的值。如上例中<input type="text" name="column" />的value。
String fieldValue = item.getString("UTF-8");// 请求参数值。getString方法用于将FileItem对象中保存的数据流内容以一个字符串返回,它有两个重载的定义形式:
//public Java.lang.String getString()
//public java.lang.String getString(java.lang.String encoding)
//throws java.io.UnsupportedEncodingException
//前者使用缺省的字符集编码将主体内容转换成字符串,后者使用参数指定的字符集编码将主体内容转换成字符串。如果在读取普通表单字段元素的内容时出现了中文乱码现象,请调用第二个getString方法,并为之传递正确的字符集编码名称。
System.out.println(fieldName + "=" + fieldValue);
} else {
// 6、上传表单:得到输入流,处理上传:保存到服务器的某个目录中,保存时的文件名是啥?
String fileName = item.getName();// 得到上传文件的名称 C:\Documents
// and
// Settings\shc\桌面\a.txt
// a.txt
//getName方法用于获得文件上传字段中的文件名.注意IE或FireFox中获取的文件名是不一样的,IE中是绝对路径,FireFox中只是文件名。
//解决用户没有选择文件上传的情况
if(fileName==null||fileName.trim().equals("")){
continue;
}
fileName = fileName
.substring(fileName.lastIndexOf("\\") + 1);
String newFileName = UUID.randomUUID().toString() + "_" + fileName;
System.out.println("上传的文件名是:" + fileName);
InputStream in = item.getInputStream();
String savePath = makeDir(storePath, fileName) + "\\"
+ newFileName;
OutputStream out = new FileOutputStream(savePath);
byte b[] = new byte[1024];
int len = -1;
while ((len = in.read(b)) != -1) {
out.write(b, 0, len);
}
in.close();
out.close();
item.delete();//删除临时文件
}
}
}catch(FileUploadBase.FileSizeLimitExceededException e){
request.setAttribute("message", "单个文件大小不能超出5M");
request.getRequestDispatcher("/message.jsp").forward(request,
response);
}catch(FileUploadBase.SizeLimitExceededException e){
request.setAttribute("message", "总文件大小不能超出7M");
request.getRequestDispatcher("/message.jsp").forward(request,
response);
}catch (Exception e) {
e.printStackTrace();
request.setAttribute("message", "上传失败");
request.getRequestDispatcher("/message.jsp").forward(request,
response);
}
}
private String makeDir(String storePath, String fileName) {
int hashCode = fileName.hashCode();// 得到文件名的hashcode码
int dir1 = hashCode & 0xf;// 取hashCode的低4位 0~15
int dir2 = (hashCode & 0xf0) >> 4;// 取hashCode的高4位 0~15
String path = storePath + "\\" + dir1 + "\\" + dir2;
File file = new File(path);
if (!file.exists())
file.mkdirs();
System.out.println("存储路径是"+path);
return path;
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
}
- 添加两个库文件
- 配置Tomcat服务器的路径
参考:
先把项目“aiator” remove。右键-remove。然后双击“Tomcat v 7.0 Server at localhost” - Server path是安装文件夹,Deploy path是安装路径下的wepapps文件夹
- 局域网其他设备无法访问Tomcat服务器
参考: 把那些阻止都改成允许就好了