当前位置 : 主页 > 编程语言 > java >

为app提供拍照上传的Servlet

来源:互联网 收集:自由互联 发布时间:2021-06-28
gistfile1.txt package com.server.android.servlet;import java.io.BufferedInputStream;import java.io.ByteArrayOutputStream;import java.io.File;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStream;import java.i
gistfile1.txt
package com.server.android.servlet;

import java.io.BufferedInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
import java.util.List;

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 org.apache.tomcat.util.http.fileupload.FileItem;
import org.apache.tomcat.util.http.fileupload.FileUploadException;
import org.apache.tomcat.util.http.fileupload.RequestContext;
import org.apache.tomcat.util.http.fileupload.disk.DiskFileItemFactory;
import org.apache.tomcat.util.http.fileupload.servlet.ServletFileUpload;

/**
 * @author 作者 YeYouWang:
 * @date 创建时间:2017年11月15日 下午2:59:35
 * @version 1.0
 * @parameter 
 * @since 
 * @return 
 */
//为app提供拍照上传
@WebServlet(name="UploadChartServlet",value= {"/servlet/UploadChartServlet","/jbx_server/servlet/UploadChartServlet"})
public class UploadChartServlet extends HttpServlet{

	private static final long serialVersionUID = 1L;
	private String path;
	
	public UploadChartServlet() {
		super();
	}
	
	@Override
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		this.doPost(request, response);
	}
	
	@Override
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		
		response.setContentType("text/html;charset=utf-8");
		request.setCharacterEncoding("utf-8");
		response.setCharacterEncoding("utf-8");
		PrintWriter out = response.getWriter();
		
		//创建工厂对象
		DiskFileItemFactory factory = new DiskFileItemFactory();
		//文件上传路径
		String upload = this.getServletContext().getRealPath("/");
		//临时保存路径
		String temp = System.getProperty("java.io.tmpdir");
		//缓冲区大小为5M
		factory.setSizeThreshold(1024*1024*5);
		//临时文件为temp
		factory.setRepository(new File(temp));
		//解析上传文件请求
		ServletFileUpload servletFileUpload = new ServletFileUpload(factory);
		
		
		try {
			//解析结果放进List中
			List
 
   list = servletFileUpload.parseRequest((RequestContext) request);
			
			for(FileItem item : list) {
				String name = item.getFieldName();
				InputStream is = item.getInputStream();
				
				if(name.contains("content")) {
					System.out.println(inputStreamString(is));
				}else if (name.contains("img")) {
					
					try {
						path = upload+"\\"+item.getName();
						inputStreamFile(is, path);
						break;
					} catch (Exception e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
					
				}{
					
				}
			}
			out.write(path);//这里是服务端成功后返回给客户端的是上传成功后的路径
		} catch (FileUploadException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			System.out.println("failure");
			out.write("failure");
		}
		//清空关闭
		out.flush();
		out.close();
		
	}
	//流转化成字符串
	public static String inputStreamString(InputStream is) throws IOException{
		ByteArrayOutputStream baos = new ByteArrayOutputStream();
		int i = -1;
		while((i=is.read()) !=-1) {
			baos.write(i);
		}
		return baos.toString();
		
	}
	//转化成文件
	public static void inputStreamFile(InputStream is,String savePath) throws Exception{
		System.out.println("文件路径为:"+savePath);
		File file = new File(savePath);
		InputStream inputStream = is;
		BufferedInputStream fis = new BufferedInputStream(inputStream);
		FileOutputStream fos = new FileOutputStream(file);
		
		int f;
		while((f = fis.read()) !=-1) {
			fos.write(f);
		}
		fos.flush();
		fos.close();
		fis.close();
		inputStream.close();
	}

}
 
上传的工具类
public class UploadUtil {
    private static final String TAG = "uploadFile";
    private static final int TIME_OUT = 10*1000;   //超时时间
    private static final String CHARSET = "utf-8"; //设置编码
    /**
     * android上传文件到服务器
     * @param file  需要上传的文件
     * @param RequestURL  请求的rul
     * @return  返回响应的内容
     */
    public static String uploadFile(File file,String RequestURL){
        String result = null;
        String  BOUNDARY =  UUID.randomUUID().toString();  //边界标识   随机生成
        String PREFIX = "--" , LINE_END = "\r\n"; 
        String CONTENT_TYPE = "multipart/form-data";   //内容类型
        
        try {
            URL url = new URL(RequestURL);
            HttpURLConnection conn = (HttpURLConnection) url.openConnection();
            conn.setReadTimeout(TIME_OUT);
            conn.setConnectTimeout(TIME_OUT);
            conn.setDoInput(true);  //允许输入流
            conn.setDoOutput(true); //允许输出流
            conn.setUseCaches(false);  //不允许使用缓存
            conn.setRequestMethod("POST");  //请求方式
            conn.setRequestProperty("Charset", CHARSET);  //设置编码
            conn.setRequestProperty("connection", "keep-alive");   
            conn.setRequestProperty("Content-Type", CONTENT_TYPE + ";boundary=" + BOUNDARY); 
            conn.connect();
            
            if(file!=null){
                /**
                 * 当文件不为空,把文件包装并且上传
                 */
                DataOutputStream dos = new DataOutputStream( conn.getOutputStream());
                StringBuffer sb = new StringBuffer();
                sb.append(PREFIX);
                sb.append(BOUNDARY);
                sb.append(LINE_END);
                /**
                 * 这里重点注意:
                 * name里面的值为服务器端需要key   只有这个key 才可以得到对应的文件
                 * filename是文件的名字,包含后缀名的   比如:abc.png  
                 */
                
                sb.append("Content-Disposition: form-data; name=\"img\"; filename=\""+file.getName()+"\""+LINE_END); 
                sb.append("Content-Type: application/octet-stream; charset="+CHARSET+LINE_END);
                sb.append(LINE_END);
                dos.write(sb.toString().getBytes());
                InputStream is = new FileInputStream(file);
                byte[] bytes = new byte[1024];
                int len = 0;
                while((len=is.read(bytes))!=-1){
                    dos.write(bytes, 0, len);
                }
                is.close();
                dos.write(LINE_END.getBytes());
                byte[] end_data = (PREFIX+BOUNDARY+PREFIX+LINE_END).getBytes();
                dos.write(end_data);
                dos.flush();
                /**
                 * 获取响应码  200=成功
                 * 当响应成功,获取响应的流  
                 */
                int res = conn.getResponseCode();  
	            if(res==200){
                    InputStream input =  conn.getInputStream();
                    StringBuffer sb1= new StringBuffer();
                    int ss ;
                    while((ss=input.read())!=-1){
                        sb1.append((char)ss);
                    }
                    result = sb1.toString();
                    System.out.println(result);
	            }
            }
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return result;
    }
}
这里就是调用上传的方法
File file = new File(path); //这里的path就是那个地址的全局变量
							
String result = UploadUtil.uploadFile(file, RequestURL);
网友评论