您的位置:首页 > 其它

服务器接受客户端图片

2015-12-13 12:37 309 查看
写一个服务器接受客户端的图片然后保存在数据库的实例,不知道怎么弄,结果还是基础不够牢靠,对http请求抓包,看了看HTTP请求的信息,感觉一下子明白了很多。现在还望大家分享一下,希望能有帮助。

这是jsp的上传图片的表单,代码是考过来的,为了测试需要。

<html>
<head>
<title>File Uploading Form</title>
</head>
<body>
<h3>File Upload:</h3>
Select a file to upload: <br />
<form action="servlet/AcceptFileServlet" method="post" enctype="multipart/form-data">
<input type="file" name="image" size="50" />
<br />
<input type="submit" value="Upload File" />
</form>
</body>
</html>


当然要有对应的Servlet,但是我们先抓包看看他发送的是什么。

抓包的结果如下图:



看看上面的请求的头,现在我们一一分析:

Accept:浏览器可以处理的类型。

Accept-Encoding:浏览器发给服务器告诉服务器自己可以支持的类型

Cache-Control:制定请求和相应遵循的缓存机制

Content-Type:multipart/form-data是文件请求的标识

主要我们介绍的是下面的Request Payload

------WebKitFormBoundaryVcgWIn0xGWgXTsCe:使用来分割表单请求内容的,一个表单的请求内容大致在HTTP中显示的分为两个部分:

Content-Disposition:显示了表单信息,表单的名称,表单传送的文件的名称

Content-Type:表单传送的文件的类型。

剩下的就是需要上传的二进制文件了

知道了这些东西,我们应当知道fileupload这个jar中大概只是怎样实现文件的上传了吧。解析HTTP头信息然后进行判断,封装,队得到的流进行读取写入操作。

fileupload中的FileItem就是对HTTP中的Request Payload进行封装的结果,它对应的方法也是取其中的信息。

下面附上Servlet的代码:

DiskFileItemFactory factory = new DiskFileItemFactory();
//生成临时文件的据对路径
String tempPath = getServletContext().getRealPath("/temp");
String photoPath = getServletContext().getRealPath("/photo");
System.out.println(photoPath);
//超过5M数用临时文件来保存而不是保存在内存中
factory.setSizeThreshold(1024*1024*5);
//用于临时存储文件
factory.setRepository(new File(tempPath));
//上传文件的高级类
ServletFileUpload fileUpload = new ServletFileUpload(factory);
try {
//封装HTTP中的主体内容
List<FileItem> list = fileUpload.parseRequest(request);
for (FileItem fileItem : list) {
//如果得到头信息是文件类型的话
if(fileItem.getContentType().equals("image/png")){
String filename = fileItem.getName();
try {
//将文件主体写进创建的文件中
fileItem.write(new File(photoPath));
System.out.println("yes");
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//如果不是文件类型的话
else{
System.out.println("no");
}

}
} catch (FileUploadException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: