您的位置:首页 > 其它

安卓实现上传文件到服务器(转)

2017-04-19 19:08 239 查看
电脑向服务器发送文件比较简单,通过表单就能实现post提交。在安卓上也不难,拼接好请求头就可以了。

安卓端代码:

package com.example.photo;  

  

import java.io.BufferedReader;  

import java.io.DataOutputStream;  

import java.io.File;  

import java.io.FileInputStream;  

import java.io.IOException;  

import java.io.InputStream;  

import java.io.InputStreamReader;  

import java.io.OutputStream;  

import java.net.HttpURLConnection;  

import java.net.MalformedURLException;  

import java.net.URL;  

import java.util.UUID;  

  

  

public class HttpAssist {  

    private static final String TAG = "uploadFile";  

    private static final int TIME_OUT = 10 * 10000000; // 超时时间  

    private static final String CHARSET = "utf-8"; // 设置编码  

    public static final String SUCCESS = "1";  

    public static final String FAILURE = "0";  

  

    public static String uploadFile(File file) {  

        String BOUNDARY = UUID.randomUUID().toString(); // 边界标识 随机生成  

        String PREFIX = "--", LINE_END = "\r\n";  

        String CONTENT_TYPE = "multipart/form-data"; // 内容类型  

        String RequestURL = "http://192.168.0.100:7080/YkyPhoneService/Uploadfile1";  

        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);  

            if (file != null) {  

                /** 

                 * 当文件不为空,把文件包装并且上传 

                 */  

                OutputStream outputSteam = conn.getOutputStream();  

  

                DataOutputStream dos = new DataOutputStream(outputSteam);  

                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) {  

                    return SUCCESS;  

                }  

            }  

        } catch (MalformedURLException e) {  

            e.printStackTrace();  

        } catch (IOException e) {  

            e.printStackTrace();  

        }  

        return FAILURE;  

    }  

}  

服务器接收上传的文件的方法最后是通过利用apache提供的两个jar包来实现的。commons-fileupload.jar和commons-io.jar这俩jar包。在服务器端添加这俩包之后,写一个Servlet来实现文件接收。

public class Uploadfile1 extends HttpServlet {  

  

    @Override  

    public void doPost(HttpServletRequest request, HttpServletResponse response)  

            throws ServletException, IOException {  

        request.setCharacterEncoding("utf-8");  

        //获得磁盘文件条目工厂。  

        DiskFileItemFactory factory = new DiskFileItemFactory();  

        //获取文件上传需要保存的路径,upload文件夹需存在。  

        String path = request.getSession().getServletContext().getRealPath("/upload");  

        //设置暂时存放文件的存储室,这个存储室可以和最终存储文件的文件夹不同。因为当文件很大的话会占用过多内存所以设置存储室。  

        factory.setRepository(new File(path));  

        //设置缓存的大小,当上传文件的容量超过缓存时,就放到暂时存储室。  

        factory.setSizeThreshold(1024*1024);  

        //上传处理工具类(高水平API上传处理?)  

        ServletFileUpload upload = new ServletFileUpload(factory);  

          

        try{  

            //调用 parseRequest(request)方法  获得上传文件 FileItem 的集合list 可实现多文件上传。  

            List<FileItem> list = (List<FileItem>)upload.parseRequest(request);  

            for(FileItem item:list){  

                //获取表单属性名字。  

                String name = item.getFieldName();  

                //如果获取的表单信息是普通的文本信息。即通过页面表单形式传递来的字符串。  

                if(item.isFormField()){  

                    //获取用户具体输入的字符串,  

                    String value = item.getString();  

                    request.setAttribute(name, value);  

                }  

                //如果传入的是非简单字符串,而是图片,音频,视频等二进制文件。  

                else{   

                    //获取路径名  

                    String value = item.getName();  

                    //取到最后一个反斜杠。  

                    int start = value.lastIndexOf("\\");  

                    //截取上传文件的 字符串名字。+1是去掉反斜杠。  

                    String filename = value.substring(start+1);  

                    request.setAttribute(name, filename);  

                      

                    /*第三方提供的方法直接写到文件中。 

                     * item.write(new File(path,filename));*/  

                    //收到写到接收的文件中。  

                    OutputStream out = new FileOutputStream(new File(path,filename));  

                    InputStream in = item.getInputStream();  

                      

                    int length = 0;  

                    byte[] buf = new byte[1024];  

                    System.out.println("获取文件总量的容量:"+ item.getSize());  

                      

                    while((length = in.read(buf))!=-1){  

                        out.write(buf,0,length);  

                    }  

                    in.close();  

                    out.close();  

                }  

            }  

        }catch(Exception e){  

            e.printStackTrace();  

        }  

          

    }  

}  

转载链接:http://www.cnblogs.com/android100/p/android-file-upload.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: