从HTTP连接下载文件,该文件重定向到HTTPS连接

时间:2012-01-09 10:04:27

标签: android https

我在我的项目中使用Dropbox从dropbox获取小网址,如http://www.db.tt/xyzabc

当我尝试在HTC My touch下载文件时,我的代码运行正常,但如果我尝试Motorola Atrix,则会抛出exception unknown host db.tt

实际上我首先得到像http://www.db.tt/xyzabc这样的网址,这是我打开它的HTTP网址,而不是我得到exception,并且在例外情况下我得到包含文件的文件的实际网址,并且是例外的HTTPS网址。我在这里开始下载文件是我的代码,对我有用:

public static void fileUrl(String fAddress, String localFileName,
        String destinationDir) {
    OutputStream outStream = null;
    URLConnection uCon = null;

    InputStream is = null;
    try {
        URL url;
        byte[] buf;
        int ByteRead, ByteWritten = 0;
        url = new URL(fAddress);
        outStream = new BufferedOutputStream(new FileOutputStream(
                destinationDir + localFileName));

        try {
            // Here i have "http://www.db.tt/xyzabc"
                       // after i hit url i get exception and in exception that
                       // FileNotFoundException at https://www.dropbox.com/abcxyz
                     // i get actual actual url i parse that exception and 
                     //retrive https://www.dropbox.com/xyzabc(actual url)
                      // but in motorolla atrix instead of that url i get
                     // unknownhost exception "db.tt"




            uCon = url.openConnection();   
        //  uCon.connect();

            is = uCon.getInputStream();
        } catch (Exception e) {
            url = new URL(e.getMessage().substring(
                    e.getMessage().indexOf("https"),
                    e.getMessage().length()));
            outStream = new BufferedOutputStream(new FileOutputStream(
                    destinationDir + localFileName));

            uCon = url.openConnection();
            is = uCon.getInputStream();
        }

        buf = new byte[size];
        while ((ByteRead = is.read(buf)) != -1) {
            outStream.write(buf, 0, ByteRead);
            ByteWritten += ByteRead;
        }
        System.out.println("Downloaded Successfully.");
        System.out.println("File name:\"" + localFileName
                + "\"\nNo ofbytes :" + ByteWritten);
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        try {
            is.close();
            outStream.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

2 个答案:

答案 0 :(得分:1)

好几次尝试后我就解决了我的问题,如果有人遇到同样的问题需要根据需要进行错误处理和修改,解决方案将会有所帮助

在看到Connection的类层次结构后,发现HttpsURLConnection是HttpURLConnection的子项,而HttpURLConnection是UrlConnection的子项,所以我使用了HTTPConnection而不是UrlConnection,因为HttpsUrlConnection是具体的HttpsUrlConnection,它解决了我的问题 我继续迭代,直到重定向后得到Https网址

public static void fileUrl(String fAddress, String localFileName,
        String destinationDir) {
    OutputStream outStream = null;
    URLConnection uCon = null;
    HttpURLConnection mHttpCon;

    InputStream is = null;
    try {

        URL url;
        byte[] buf;
        int ByteRead, ByteWritten = 0;
        url = new URL(fAddress);
        outStream = new BufferedOutputStream(new FileOutputStream(
                destinationDir + localFileName));

        try {

            mHttpCon = (HttpURLConnection) url.openConnection();

            while (!url.toString().startsWith("https")) {
                mHttpCon.getResponseCode();
                url = mHttpCon.getURL();
                mHttpCon = (HttpURLConnection) url.openConnection();

            }

            is = mHttpCon.getInputStream();
        } catch (Exception e) {
            e.printStackTrace();
            // url = new URL(e.getMessage().substring(
            // e.getMessage().indexOf("https"),
            // e.getMessage().length()));
            // outStream = new BufferedOutputStream(new FileOutputStream(
            // destinationDir + localFileName));
            //
            // uCon = url.openConnection();
            // is = uCon.getInputStream();
        }

        buf = new byte[size];
        while ((ByteRead = is.read(buf)) != -1) {
            outStream.write(buf, 0, ByteRead);
            ByteWritten += ByteRead;
        }
        System.out.println("Downloaded Successfully.");
        System.out.println("File name:\"" + localFileName
                + "\"\nNo ofbytes :" + ByteWritten);
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        try {
            is.close();
            outStream.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

public static void fileDownload(String fAddress, String destinationDir) {

    int slashIndex = fAddress.lastIndexOf('/');
    int periodIndex = fAddress.lastIndexOf('.');

    String fileName = fAddress.substring(slashIndex + 1);

    if (periodIndex >= 1 && slashIndex >= 0
            && slashIndex < fAddress.length() - 1) {
        fileUrl(fAddress, fileName, destinationDir);
    } else {
        System.err.println("path or file name.");
    }
}

答案 1 :(得分:1)

这个答案在某种程度上有效。我有一个类似的解决方案here

Atrix上的Dropbox短超链接仍然存在问题。他们从http重定向到https但不是重定向到所需的文件,而是从Dropbox内部获取了大量的HTML。