一个能作为安卓上传文件目的地的使用servlet的Tomcat服务器

想实现一个服务器端,能够接受安卓端上传的文字和图片数据,并保存。
实现方法是J2EE+servlet+Tomcat。

  1. 配置环境
    参考:http://www.runoob.com/jsp/eclipse-jsp.html
  2. 代码
    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);
	}

}

  1. 添加两个库文件
    在这里插入图片描述

  2. 配置Tomcat服务器的路径
    参考:
    先把项目“aiator” remove。右键-remove。然后双击“Tomcat v 7.0 Server at localhost”
    在这里插入图片描述
    Server path是安装文件夹,Deploy path是安装路径下的wepapps文件夹
    在这里插入图片描述

  3. 局域网其他设备无法访问Tomcat服务器
    参考:https://blog.csdn.net/zhanglei892721/article/details/78687507
    把那些阻止都改成允许就好了

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值