0

サーバーからいくつかのテキスト ファイルをダウンロードしようとしています。それらはすべて似たような名前 (例: text1.txt、txt2.txt) ですが、番号が異なります (毎月数量が変わります)。ファイルをダウンロードできないようです。Javaは、ファイルが見つからないというエラー/例外が発生していると私に言い続けます。これを乗り越える方法を知っている人はいますか?

ダウンロード クラス。

  public class downloadText extends AsyncTask<String, String, String> {
        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            showDialog(DIALOG_DOWNLOAD_PROGRESS);
        }

        @Override
        protected String doInBackground(String... params) {

            try {


                File sourceLocation = new File(targetPath);
                sources = sourceLocation.listFiles();

                Arrays.sort(sources);


                File root = android.os.Environment
                        .getExternalStorageDirectory();
                File dir = new File(root.getAbsolutePath() + "aiyo/edition/text/");

                if (dir.exists() == false) {
                    dir.mkdirs();
                }

                Log.d("param", params[0]);
                URL url = new URL("http://create.aiyomag.com/assets/app_mag/ALYO/9_1342080926/text"); // you can write here any link
                URLConnection connection = url.openConnection();
                connection.connect();

                int contentLength=connection.getContentLength();


                // get file name and file extension


                String fileExtenstion = MimeTypeMap
                        .getFileExtensionFromUrl(params[0]);
                String name = URLUtil.guessFileName(params[0], null,
                        fileExtenstion);
                File file = new File(dir, name);
                Log.d("File in content","The file is "+file.getName());

                /*
                 * Define InputStreams to read from the URLConnection.
                 */
                InputStream is = connection.getInputStream();
                BufferedInputStream bis = new BufferedInputStream(is);
                OutputStream fos = new FileOutputStream(file);

                /*
                 * Read bytes to the Buffer until there is nothing more to
                 * read(-1).
                 */

                int lenghtOfFile = connection.getContentLength();
                int total = 0;
                byte baf[] = new byte[1024];
                int current = 0;
                while ((current = bis.read(baf)) != -1) {

                    total += current;
                    // publishProgress("" + (int) ((total * 100) /
                    // lenghtOfFile));
                    mProgressDialog.setProgress(((total * 100) / lenghtOfFile));
                    fos.write(baf, 0, current);
                }

                // close every file stream
                fos.flush();
                fos.close();
                is.close();

            } catch (IOException e) {
                Log.e("DownloadManager", "Error: " + e);
            }
           return null;
        }

        @Override
        protected void onProgressUpdate(String... values) {
            mProgressDialog.setProgress(Integer.parseInt(values[0]));
        }

        @Override
        protected void onPostExecute(String result) {
            // TODO Auto-generated method stub
          //  if (fileInteger == max) {
          //      dismissDialog(DIALOG_DOWNLOAD_PROGRESS);
          //      return;
          //  }


            Log.d("post execute", "i::" + fileInteger);
          //  fileInteger++;
            // publishProgress("" + (int) ((fileInteger * 100) / max));
        //    mProgressDialog.setSecondaryProgress(((fileInteger * 100) / max));
            String link = txturl;

            downloadText = new downloadText();
            downloadText.execute(link);
        }

メイン。

    btn_txt = (Button) findViewById(R.id.text);

    btn_txt.setOnClickListener(new OnClickListener() {

        public void onClick(View v) {
            // TODO Auto-generated method stub

            String link;
            link = txturl+fileInteger+".txt";

            new Thread(new Runnable() {
                public void run() {
                    max = (totalFile(pageNum) - 1);
                    text.post(new Runnable() {
                        public void run() {
                            text.setText("" + max);
                        }
                    });
                }
            }).start();

            downloadText = new downloadText();
            downloadText.execute(link);         
        }

        });
4

1 に答える 1

1

そのリンクにアクセスすると、403 エラーが発生します。これは、ページにアクセスできることを意味しますが、サーバーがアクセスを禁止しています。そのため、ファイルがダウンロードされていないため、リソースが見つかりませんというエラーが発生します。

自分でサーバーを実行している場合は、バックエンド コードとサーバー構成を調べて、これが発生している理由を確認できます。それ以外の場合は、サーバーの管理者に連絡して、ページへのアクセス許可を要求する必要があります。

必要な権限を取得したら、次のいずれかの方法でファイルのリストをダウンロードできます

  1. URL の配列を doInBackground メソッド (ファイルごとに 1 つ) に渡すか、

  2. より良いオプションは、管理者にスクリプトを作成してサーバー上のファイルを圧縮し、指定された URL に保存するよう依頼することです。次に、zip ファイルをダウンロードして、アプリで展開できます。これは、リクエストの数、帯域幅、およびエラーの可能性の数を節約できるため、ファイルを 1 つずつダウンロードするよりもはるかに優れています。

PHP でファイルを圧縮するサンプル コード:

<?php

// Adding files to a .zip file, no zip file exists it creates a new ZIP file

// increase script timeout value
ini_set('max_execution_time', 5000);

// create object
$zip = new ZipArchive();

// open archive 
if ($zip->open('my-archive.zip', ZIPARCHIVE::CREATE) !== TRUE) {
    die ("Could not open archive");
}

// initialize an iterator
// pass it the directory to be processed
$iterator = new RecursiveIteratorIterator(new RecursiveDirectoryIterator("themes/"));

// iterate over the directory
// add each file found to the archive
foreach ($iterator as $key=>$value) {
    $zip->addFile(realpath($key), $key) or die ("ERROR: Could not add file: $key");
}

// close and save archive
$zip->close();
echo "Archive created successfully.";
?>

zip ファイルのチュートリアルのダウンロード: http://www.java-samples.com/showtutorial.php?tutorialid=1521

ファイルの解凍に関するチュートリアル: http://www.jondev.net/articles/Unzipping_Files_with_Android_%28Programmatically%29

于 2012-10-04T03:39:10.620 に答える