代码之家  ›  专栏  ›  技术社区  ›  2red13

带有https和凭据的android文件上传

  •  1
  • 2red13  · 技术社区  · 14 年前

    我试图提出一个post请求,其中包含一个文件,问题是,我必须使用ssl和BasicCredentialprovider。以下代码适用于正常的POST请求: (url是url,nvps是nameValuePair)

        DefaultHttpClient http = new DefaultHttpClient();
        SSLSocketFactory ssl =  (SSLSocketFactory)http.getConnectionManager().getSchemeRegistry().getScheme( "https" ).getSocketFactory(); 
        ssl.setHostnameVerifier( SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER );
        final String username = "xxx";
        final String password = "xxx";
        UsernamePasswordCredentials c = new UsernamePasswordCredentials(username,password);
        BasicCredentialsProvider cP = new BasicCredentialsProvider(); 
        cP.setCredentials(AuthScope.ANY, c); 
        http.setCredentialsProvider(cP);
        HttpResponse res;
        try {
            HttpPost httpost = new HttpPost(url);
            httpost.setEntity(new UrlEncodedFormEntity(nvps, HTTP.DEFAULT_CONTENT_CHARSET));
    
            res = http.execute(httpost);
    
    
            InputStream is = res.getEntity().getContent();
            BufferedInputStream bis = new BufferedInputStream(is);
            ByteArrayBuffer baf = new ByteArrayBuffer(50);
            int current = 0;
            while((current = bis.read()) != -1){
                  baf.append((byte)current);
             }
            res = null;
            httpost = null;
            return  new String(baf.toByteArray());
           } 
        catch (ClientProtocolException e) {
            // TODO Auto-generated catch block
            return e.getMessage();
        } 
        catch (IOException e) {
            // TODO Auto-generated catch block
            return e.getMessage();
        } 
    

    我找到了下面的代码来执行文件上传,代码工作了,但是我无法将上传与authentification结合起来,让他忽略ssl错误(该证书无效)

    String BOUNDRY = "==================================";
    final String username = "xxx";
    final String password = "xxx";
    HttpURLConnection conn = null;
    try {
         String contentDisposition = "Content-Disposition: form-data; name=\"userfile\";         filename=\"" + file.getName() + "\"";
                String contentType = "Content-Type: application/octet-stream";
                // This is the standard format for a multipart request
                StringBuffer requestBody = new StringBuffer();
                requestBody.append("--");
                requestBody.append(BOUNDRY);
                requestBody.append('\n');
                requestBody.append(contentDisposition);
                requestBody.append('\n');
                requestBody.append(contentType);
                requestBody.append('\n');
                requestBody.append('\n');
    
                requestBody.append(new String(getBytesFromFile(file)));
                requestBody.append("--");
                requestBody.append(BOUNDRY);
                requestBody.append("--");
    
                // Make a connect to the server
                URL url = new URL(targetURL);
                conn = (HttpURLConnection) url.openConnection();
    
                // Put the authentication details in the request
                conn.setDoOutput(true);
                conn.setDoInput(true);
                conn.setUseCaches(false);
                conn.setRequestMethod("POST");
                conn.setRequestProperty("Content-Type", "multipart/form-data; boundary=" + BOUNDRY);
    
                // Send the body
                DataOutputStream dataOS = new DataOutputStream(conn.getOutputStream());
                dataOS.writeBytes(requestBody.toString());
                dataOS.flush();
                dataOS.close();
    
                // Ensure we got the HTTP 200 response code
                int responseCode = conn.getResponseCode();
                if (responseCode != 200) {
                    throw new Exception(String.format("Received the response code %d from the URL %s", responseCode, url));
                }
    
                // Read the response
                InputStream is = conn.getInputStream();
                ByteArrayOutputStream baos = new ByteArrayOutputStream();
                byte[] bytes = new byte[1024];
                int bytesRead;
                while((bytesRead = is.read(bytes)) != -1) {
                    baos.write(bytes, 0, bytesRead);
                }
                byte[] bytesReceived = baos.toByteArray();
                baos.close();
    
                is.close();
                String response = new String(bytesReceived);
                ret = response;
                // TODO: Do something here to handle the 'response' string
    
            } finally {
                if (conn != null) {
                    conn.disconnect();
                }
            }
    

    有什么建议吗?

    1 回复  |  直到 14 年前
        1
  •  3
  •   2red13    14 年前

    通过添加appache-mime4j-0.6.jar和httpime-4.0.3.jar以及以下代码解决了这个问题:

    public static boolean upload_image(String url, List<NameValuePair> nameValuePairs,String encoding) {
    
            DefaultHttpClient http = new DefaultHttpClient();
            SSLSocketFactory ssl =  (SSLSocketFactory)http.getConnectionManager().getSchemeRegistry().getScheme( "https" ).getSocketFactory(); 
            ssl.setHostnameVerifier( SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER );
            final String username = "xxx";
            final String password = "xxx";
            UsernamePasswordCredentials c = new UsernamePasswordCredentials(username,password);
            BasicCredentialsProvider cP = new BasicCredentialsProvider(); 
            cP.setCredentials(AuthScope.ANY, c); 
            http.setCredentialsProvider(cP);
            HttpResponse res;
            try {
                HttpPost httpost = new HttpPost(url);
                MultipartEntity entity = new MultipartEntity(HttpMultipartMode.STRICT); 
    
                for(int index=0; index < nameValuePairs.size(); index++) { 
                    ContentBody cb;
                    if(nameValuePairs.get(index).getName().equalsIgnoreCase("File")) { 
                        File file = new File(nameValuePairs.get(index).getValue());
                        FileBody isb = new FileBody(file,"application/*");
    
                        /*
                        byte[] data = new byte[(int) file.length()];
                        FileInputStream fis = new FileInputStream(file);
                        fis.read(data);
                        fis.close();
    
                        ByteArrayBody bab = new ByteArrayBody(data,"application/*","File");
                        entity.addPart(nameValuePairs.get(index).getName(), bab);
                        */  
                        entity.addPart(nameValuePairs.get(index).getName(), isb);
                    } else { 
                        // Normal string data 
                        cb =  new StringBody(nameValuePairs.get(index).getValue(),"", null);
                        entity.addPart(nameValuePairs.get(index).getName(),cb); 
                    } 
                } 
    
    
                httpost.setEntity(entity);
                res = http.execute(httpost);
    
                InputStream is = res.getEntity().getContent();
                BufferedInputStream bis = new BufferedInputStream(is);
                ByteArrayBuffer baf = new ByteArrayBuffer(50);
                int current = 0;
                while((current = bis.read()) != -1){
                      baf.append((byte)current);
                 }
                res = null;
                httpost = null;
                String ret = new String(baf.toByteArray(),encoding);
                GlobalVars.LastError = ret;
                return  true;
               } 
            catch (ClientProtocolException e) {
                // TODO Auto-generated catch block
                return true;
            } 
            catch (IOException e) {
                // TODO Auto-generated catch block
                return true;
            } 
    }