Правильный способ объявить URL? - PullRequest
1 голос
/ 28 января 2012

В моем приложении я пытаюсь загрузить файл с моего сайта, но у меня возникло несколько проблем с ним.Во-первых, я не могу понять, как правильно объявить URL.Во-вторых, когда я запускаю приложение, оно падает, когда я говорю соединению получить InputStream.Я понятия не имею, что я делаю неправильно.Большую часть дня я искал в Интернете и перепробовал множество методов, чтобы решить проблему с URL, но безуспешно.

Мне бы очень хотелось узнать, что я делаю неправильно, поэтому любая помощь предоставленабудет принята с благодарностью.

package shc_BalloonSat.namespace;

import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.net.URLConnection;
import java.net.URLEncoder;

import org.apache.http.util.ByteArrayBuffer;

import android.util.Log;

public class dl_viewKML
{
    String file_path = "";
    String file_url;
    String file_name;

    void downloadFile()
    {
        try
        {
            String file_name = "data.kml";

            //URL url = new URL("http://space.uah.edu");
            String encodedURL = "http:////"+URLEncoder.encode("www.wktechnologies.com/shc_android_app/", "UTF-8");
            URL url = new URL(encodedURL);
            File file = new File(url + "/" + file_name);

            long startTime = System.currentTimeMillis();
            Log.d("SHC BalloonSat", "Download beginning: ");
            Log.d("SHC BalloonSat", "Download url: " + url);
            Log.d("SHC BalloonSat", "Downloaded file name: " + file_name);

            // Open a connection to the specified URL
            URLConnection conn = url.openConnection();

            // Define InputStreams to read from the URLConnection.
            InputStream is = conn.getInputStream();//crashes here
            BufferedInputStream bis = new BufferedInputStream(is);

            // Read bytes to the Buffer until there is nothing more to read(-1).
            ByteArrayBuffer baf = new ByteArrayBuffer(50);
            int current = 0;
            while ((current = bis.read()) != -1)
            {
                baf.append((byte) current);
            }

            // Convert the Bytes read to a String.
            FileOutputStream fos = new FileOutputStream(file);
            fos.write(baf.toByteArray());
            fos.close();
            Log.d("SHC BalloonSat", "Download ready in: " + ((System.currentTimeMillis() - startTime) / 1000) + " secs.");
            }

            catch (IOException e)
            {
                Log.e("log_tag", "Error: " + e.toString());
            }   
    }
}

Ответы [ 3 ]

1 голос
/ 28 января 2012

Нет необходимости вызывать URLEncoder с помощью URL.URLEncoder.encode используется для кодирования параметров:

, поэтому отредактируйте свой код как:

void downloadFile()
{
    try
    {
        String file_name = "data.kml";

        //URL url = new URL("http://space.uah.edu");
        String encodedURL =         "http://"+"www.wktechnologies.com/shc_android_app/data.kml";
        URL url = new URL(encodedURL);

        // Open a connection to the specified URL
        URLConnection conn = url.openConnection();

        // Define InputStreams to read from the URLConnection.
        InputStream is = conn.getInputStream();//crashes here
        BufferedInputStream bis = new BufferedInputStream(is);

        // Read bytes to the Buffer until there is nothing more to read(-1).
        ByteArrayBuffer baf = new ByteArrayBuffer(50);
        int current = 0;
        while ((current = bis.read()) != -1)
        {
            baf.append((byte) current);
        }

        // Convert the Bytes read to a String.
        FileOutputStream fos = new FileOutputStream(file);
        fos.write(baf.toByteArray());
        fos.close();
        Log.d("SHC BalloonSat", "Download ready in: " + ((System.currentTimeMillis() - startTime) / 1000) + " secs.");
    }

    catch (IOException e)
    {
        Log.e("log_tag", "Error: " + e.toString());
    }

}
0 голосов
/ 28 января 2012

Убедитесь, что в своем манифесте вы указали разрешение на доступ в Интернет.

Вы можете использовать следующее

public class dl_viewKML
{

private static final String encodedURL ="http://www.wktechnologies.com/shc_android_app/";
String file_path = "";
String file_url;
String file_name;

void downloadFile()
{
try
{
    String file_name = "data.kml";

    //URL url = new URL("http://space.uah.edu");

    URL url = new URL(encodedURL);
    File file = new File(url + "/" + file_name);

    long startTime = System.currentTimeMillis();
    Log.d("SHC BalloonSat", "Download beginning: ");
    Log.d("SHC BalloonSat", "Download url: " + url);
    Log.d("SHC BalloonSat", "Downloaded file name: " + file_name);

    // Open a connection to the specified URL
    URLConnection conn = url.openConnection();

    // Define InputStreams to read from the URLConnection.
    InputStream is = conn.getInputStream();//crashes here
    BufferedInputStream bis = new BufferedInputStream(is);

    // Read bytes to the Buffer until there is nothing more to read(-1).
    ByteArrayBuffer baf = new ByteArrayBuffer(50);
    int current = 0;
    while ((current = bis.read()) != -1)
    {
        baf.append((byte) current);
    }

    // Convert the Bytes read to a String.
    FileOutputStream fos = new FileOutputStream(file);
    fos.write(baf.toByteArray());
    fos.close();
    Log.d("SHC BalloonSat", "Download ready in: " + ((System.currentTimeMillis() - startTime) / 1000) + " secs.");
}

catch (IOException e)
{
    Log.e("log_tag", "Error: " + e.toString());
}

}
0 голосов
/ 28 января 2012

использовать String encodedURL = "http://www.wktechnologies.com/shc_android_app/"; Кодирование, которое вы применили, было неверным, посмотрите на раздел 3 RFC3986 (http://tools.ietf.org/html/rfc3986#section-3).. В нем рассказывается, как кодировать различные части URI. К сожалению, каждая часть URI (хост, путь, запрос и т. д.) ) имеет немного другие правила кодирования.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...