Android上的HttpURLConnection失败

时间:2009-07-13 09:21:32

标签: android http httpurlconnection

已解决 - 请参阅下面的评论

我有一个实现多部分文件上传的类。代码适用于我尝试过的每个java客户端,除了Android,它是我的Android应用程序中唯一不能与我的后端服务配合使用的HTTP请求代码。

连接responseCode是“-1”所以这里有一些非常讨厌的东西。在Apache访问或错误日志中没有显示任何条目,似乎请求永远不会脱离Android平台。代码通过连接写入正确,但挂起连接读取,超时然后返回。真实手机和模拟器的行为相同。

有人知道在Android中发布多部分文件时需要注意的任何问题吗?

我包括下面的课程(制作的小卫生模组),所以你可以看到我的目标

import java.io.ByteArrayOutputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;

public class GeoPictureUploader
{
    static String serviceDomain = "http://staging.abaqus.net";
    static String postUrl = serviceDomain + "/geo/upl/wupload/pictures";
    static String CRLF = "\r\n"; 
    static String twoHyphens = "--"; 
    static String boundary = "*****mgd*****"; 

    private String pictureFileName = null;
    private String name = null;
    private String password = null;
    private DataOutputStream dataStream = null;

    enum ReturnCode { noPicture, unknown, http201, http400, http401, http403, http404, http500};

    public GeoPictureUploader(String name, String password) 
    {
        this.name = name;
        this.password = password;
    }

    public static void setServiceDomain(String domainName)
    {
        serviceDomain = domainName;
    }

    public static String getServiceDomain()
    {
        return serviceDomain;
    }

    public ReturnCode uploadPicture(String pictureFileName)
    {
        this.pictureFileName = pictureFileName;
        File uploadFile = new File(pictureFileName); 

        if (uploadFile.exists())
            try 
            { 
                FileInputStream fileInputStream = new FileInputStream(uploadFile); 
                URL connectURL = new URL(postUrl);
                HttpURLConnection conn = (HttpURLConnection)connectURL.openConnection(); 

                conn.setDoInput(true); 
                conn.setDoOutput(true); 
                conn.setUseCaches(false); 
                conn.setRequestMethod("POST"); 

                conn.setRequestProperty("User-Agent", "myGeodiary-V1");
                conn.setRequestProperty("Connection","Keep-Alive"); 
                conn.setRequestProperty("Content-Type","multipart/form-data;boundary="+boundary); 

                conn.connect();

                dataStream = new DataOutputStream(conn.getOutputStream()); 

                writeFormField("login", name);
                writeFormField("password", password);
                writeFileField("photo1", pictureFileName, "image/jpg", fileInputStream);

                // final closing boundary line
                dataStream.writeBytes(twoHyphens + boundary + twoHyphens + CRLF); 

                fileInputStream.close(); 
                dataStream.flush(); 
                dataStream.close();
                dataStream = null;

                String response = getResponse(conn);
                int responseCode = conn.getResponseCode();

                if (response.contains("uploaded successfully"))
                    return ReturnCode.http201;
                else 
                    // for now assume bad name/password
                    return ReturnCode.http401; 
            } 
            catch (MalformedURLException mue) { 
                // Log.e(Tag, "error: " + mue.getMessage(), mue); 
                System.out.println("GeoPictureUploader.uploadPicture: Malformed URL: " + mue.getMessage());
                return ReturnCode.http400;
            } 
            catch (IOException ioe) { 
                // Log.e(Tag, "error: " + ioe.getMessage(), ioe); 
                System.out.println("GeoPictureUploader.uploadPicture: IOE: " + ioe.getMessage());
                return ReturnCode.http500;
            } 
            catch (Exception e) { 
                // Log.e(Tag, "error: " + ioe.getMessage(), ioe); 
                System.out.println("GeoPictureUploader.uploadPicture: unknown: " + e.getMessage());
                return ReturnCode.unknown;
            } 
        else 
        {
            return ReturnCode.noPicture;  
        }
    }

    /**
     * @param conn
     * @return
     */
    private String getResponse(HttpURLConnection conn)
    {
        try 
        {
            DataInputStream dis = new DataInputStream(conn.getInputStream()); 
            byte []        data = new byte[1024];
            int             len = dis.read(data, 0, 1024);

            dis.close();
            int responseCode = conn.getResponseCode();

            if (len > 0)
                return new String(data, 0, len);
            else
                return "";
        }
        catch(Exception e)
        {
            System.out.println("GeoPictureUploader: biffed it getting HTTPResponse");
            //Log.e(TAG, "GeoPictureUploader: biffed it getting HTTPResponse");
            return "";
        }
    }

    /**
     *  this mode of reading response no good either
     */
    private String getResponseOrig(HttpURLConnection conn)
    {
        InputStream is = null;
        try 
        {
            is = conn.getInputStream(); 
            // scoop up the reply from the server
            int ch; 
            StringBuffer sb = new StringBuffer(); 
            while( ( ch = is.read() ) != -1 ) { 
                sb.append( (char)ch ); 
            } 
            return sb.toString();   // TODO Auto-generated method stub
        }
        catch(Exception e)
        {
            System.out.println("GeoPictureUploader: biffed it getting HTTPResponse");
            //Log.e(TAG, "GeoPictureUploader: biffed it getting HTTPResponse");
        }
        finally 
        {
            try {
            if (is != null)
                is.close();
            } catch (Exception e) {}
        }

        return "";
    }

    /**
     * write one form field to dataSream
     * @param fieldName
     * @param fieldValue
     */
    private void writeFormField(String fieldName, String fieldValue)
    {
        try
        {
            dataStream.writeBytes(twoHyphens + boundary + CRLF);    
            dataStream.writeBytes("Content-Disposition: form-data; name=\"" + fieldName + "\"" + CRLF);
            dataStream.writeBytes(CRLF);
            dataStream.writeBytes(fieldValue);
            dataStream.writeBytes(CRLF);
        }
        catch(Exception e)
        {
            System.out.println("GeoPictureUploader.writeFormField: got: " + e.getMessage());
            //Log.e(TAG, "GeoPictureUploader.writeFormField: got: " + e.getMessage());
        }
    }

    /**
     * write one file field to dataSream
     * @param fieldName - name of file field
     * @param fieldValue - file name
     * @param type - mime type
     * @param fileInputStream - stream of bytes that get sent up
     */
    private void writeFileField(
        String fieldName,
        String fieldValue,
        String type,
        FileInputStream fis)
    {
        try
        {
            // opening boundary line
            dataStream.writeBytes(twoHyphens + boundary + CRLF);    
            dataStream.writeBytes("Content-Disposition: form-data; name=\""
                                  + fieldName
                                  + "\";filename=\"" 
                                  + fieldValue
                                  + "\"" 
                                  + CRLF);
            dataStream.writeBytes("Content-Type: " + type +  CRLF);
            dataStream.writeBytes(CRLF); 

            // create a buffer of maximum size 
            int bytesAvailable = fis.available(); 
            int maxBufferSize = 1024; 
            int bufferSize = Math.min(bytesAvailable, maxBufferSize); 
            byte[] buffer = new byte[bufferSize]; 
            // read file and write it into form... 
            int bytesRead = fis.read(buffer, 0, bufferSize); 
            while (bytesRead > 0) 
            { 
                dataStream.write(buffer, 0, bufferSize); 
                bytesAvailable = fis.available(); 
                bufferSize = Math.min(bytesAvailable, maxBufferSize); 
                bytesRead = fis.read(buffer, 0, bufferSize); 
            } 

            // closing CRLF
            dataStream.writeBytes(CRLF);
        }
        catch(Exception e)
        {
            System.out.println("GeoPictureUploader.writeFormField: got: " + e.getMessage());
            //Log.e(TAG, "GeoPictureUploader.writeFormField: got: " + e.getMessage());
        }
    }


    /**
     * @param args
     */
    public static void main(String[] args)
    {
        if (args.length >= 0)
        {
            GeoPictureUploader gpu = new GeoPictureUploader("john", "notmyrealpassword");
            String picName = args[0];

            ReturnCode rc = gpu.uploadPicture(picName);
            System.out.printf("done");
        }
    }

}

2 个答案:

答案 0 :(得分:2)

您是否设置了互联网权限?在尝试调试帖子之前,我会确保简单的获取(使用HTTPUrl来获取谷歌)。

答案 1 :(得分:0)

我已经使用相同的HttpURLConnection完成了文件上传。 我能够将高达25 MB的文件上传到宁静的服务中。 看看这可能对你有所帮助: link