分享一个web图片上传的服务端,兼同android客户端,客户端之后会写出来,我们先来看下服务端的代码。
没有写其他功能,只有一个小操作,代码如下:
package com.kevin.imageuploadserver;
import java.io.File;
import java.io.IOException;
import java.util.List;
import javax.servlet.ServletException;
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.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.apache.commons.io.FilenameUtils;
/**
* 接收图片的servlet 图片上传
*
* @author henry
*
*/
@SuppressWarnings("serial")
public class UploadImageServlet extends HttpServlet {
@Override
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 接收图片
uploadImage(request, response);
// 接收图片与用户Id
// changeUserImage(request, response);
}
// 上传图片文件
@SuppressWarnings("unused")
private void uploadImage(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String message = "";
try {
DiskFileItemFactory dff = new DiskFileItemFactory();
ServletFileUpload sfu = new ServletFileUpload(dff);
List<FileItem> items = sfu.parseRequest(request);
// 获取上传字段
FileItem fileItem = items.get(0);
// 更改文件名为唯一的
String filename = fileItem.getName();
if (filename != null) {
filename = IdGenertor.generateGUID() + "." + FilenameUtils.getExtension(filename);
}
// 生成存储路径
String storeDirectory = getServletContext().getRealPath("/files/images");
File file = new File(storeDirectory);
if (!file.exists()) {
file.mkdir();
}
String path = genericPath(filename, storeDirectory);
// 处理文件的上传
try {
fileItem.write(new File(storeDirectory + path, filename));
String filePath = "/files/images" + path + "/" + filename;
message = filePath;
} catch (Exception e) {
message = "上传图片失败";
}
} catch (Exception e) {
message = "上传图片失败";
} finally {
response.getWriter().write(message);
}
}
// 修改用户的图片
private void changeUserImage(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String message = "";
try {
DiskFileItemFactory dff = new DiskFileItemFactory();
ServletFileUpload sfu = new ServletFileUpload(dff);
List<FileItem> items = sfu.parseRequest(request);
for (FileItem item : items) {
if (item.isFormField()) {
// 普通表单
String fieldName = item.getFieldName();
String fieldValue = item.getString();
System.out.println("name=" + fieldName + ", value=" + fieldValue);
} else {// 获取上传字段
// 更改文件名为唯一的
String filename = item.getName();
// if (filename != null) {
// filename = IdGenertor.generateGUID() + "." +
// FilenameUtils.getExtension(filename);
// }
// 生成存储路径
String storeDirectory = getServletContext().getRealPath("/files/images");
File file = new File(storeDirectory);
if (!file.exists()) {
file.mkdir();
}
String path = genericPath(filename, storeDirectory);
// 处理文件的上传
try {
item.write(new File(storeDirectory + path, filename));
String filePath = "/files/images" + path + "/" + filename;
System.out.println("filePath=" + filePath);
message = filePath;
} catch (Exception e) {
message = "上传图片失败";
}
}
}
} catch (Exception e) {
e.printStackTrace();
message = "上传图片失败";
} finally {
response.getWriter().write(message);
}
}
// 计算文件的存放目录
private String genericPath(String filename, String storeDirectory) {
int hashCode = filename.hashCode();
int dir1 = hashCode & 0xf;
int dir2 = (hashCode & 0xf0) >> 4;
String dir = "/" + dir1 + "/" + dir2;
File file = new File(storeDirectory, dir);
if (!file.exists()) {
file.mkdirs();
}
return dir;
}
@Override
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
上面写了注释,一个servlet,一个jsp,以下是jsp页面:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort()
+ path + "/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>选择图片上传</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
</head>
<body>
<center>
上传配件图片: <br />
<form action="${pageContext.request.contextPath}/uploadimage"
method="post" enctype="multipart/form-data">
<input type="file" name="image" value="" /> <br /> <br /> <input
type="submit" value="submit" />
</form>
</center>
<hr>
</body>
</html>
很简单,输入框,提交按钮。然后在web.xml中配置下servlet就可以了。如下:
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<display-name></display-name>
<servlet>
<servlet-name>UploadImageServlet</servlet-name>
<servlet-class>com.kevin.imageuploadserver.UploadImageServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>UploadImageServlet</servlet-name>
<url-pattern>/uploadimage</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>
最后我把项目下载地址贴出来: