上传图片到服务器的实现

来源:互联网 发布:小黄人玩偶淘宝 编辑:程序博客网 时间:2024/05/21 08:38

本质是通过http的输入、输出流的方式上传和接收文件

一、客户端

1、客户端上传工具类:

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;                //边界标识   随机生成,产生全球唯一ID。算法的核心思想是结合机器的网卡、当地时间、一个随机数来生成GUID        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);                         if(file!=null)            {                /**                 * 当文件不为空,把文件包装并且上传                 */                DataOutputStream dos = new DataOutputStream( conn.getOutputStream());                StringBuffer sb = new StringBuffer();                sb.append(PREFIX);                sb.append(BOUNDARY);                sb.append(LINE_END);                                               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();                  Log.e(TAG, "response code:"+res);              if(res==200)              {                                   }               else{                                   }            }        } catch (MalformedURLException e) {            e.printStackTrace();        } catch (IOException e) {            e.printStackTrace();        }        return result;    }}

2、启动线程调用

new Thread(){public void run(){//要上传的本地文件路径   String srcPath = Environment.getExternalStorageDirectory().getAbsolutePath() + File.separator+"Pictures"+File.separator+"1.jpg"; String uploadUrl = "http://localhost:8080/WebModule/addAdsInfo.do?phone=123456789";    
File file = new File(srcPath);
if(file!=null){String request = UploadUtil.uploadFile(file, uploadUrl);}}}.start();

3、manifest注册文件加入权限

<uses-permission android:name="android.permission.INTERNET" />
   <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

二、服务端


1、导入java包:commons-fileupload.jar、commons-io.jar

2、服务端代码

//获得磁盘文件条目工厂。           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();          }                }  


 

 

0 0
原创粉丝点击