URL - Android中图像文件的FileNotFoundException问题

4

我正在尝试从特定的URL获取图像,但它抛出了FileNotFoundException异常。如果我尝试从浏览器中打开该URL,我可以看到这些图片。请帮忙解决问题。以下是我的代码。谢谢。

String fileURL = "http://sposter.smartag.my/images/KFC_Voucher.jpg";
String FILENAME = "caldophilus.jpg";
URL u = new URL(fileURL);
HttpURLConnection c = (HttpURLConnection) u.openConnection();
c.setRequestMethod("GET");
c.setDoOutput(true);
c.connect();
File root = Environment.getExternalStorageDirectory();
FileOutputStream f = new FileOutputStream(new File(root, FILENAME));
InputStream x=c.getInputStream();
int size=x.available();
byte b[]= new byte[size];
x.read(b);
f.write(b);
f.flush();
f.close();

你昨天已经发布了同样的问题,难道你没有得到合适的答案吗? - Lucifer
昨天我使用了Web服务来检索图像,现在我使用URL... - chinna_82
@chinna_82,我在浏览器中打开了你的URL,但是显示404错误-文件或目录未找到。 - Padma Kumar
@Padma Kumar,请现在检查一下。我已经更改了图像的URL。请检查新的URL。 - chinna_82
https://dev59.com/X1bUa4cB1Zd3GeqPCdmM - Padma Kumar
6个回答

4
我尝试了这个方法,效果很好。谢谢。
URL url = new URL(fileURL);
URLConnection conexion = url.openConnection();
conexion.connect();
int lenghtOfFile = conexion.getContentLength();
Log.d("ANDRO_ASYNC", "Lenght of file: " + lenghtOfFile);
InputStream input = new BufferedInputStream(url.openStream());
OutputStream output = new FileOutputStream("/sdcard/caldophilus.jpg");
byte data[] = new byte[1024];
long total = 0;
while ((count = input.read(data)) != -1) {
total += count;
output.write(data, 0, count);
}
output.flush();
output.close();
input.close();

3

试试这个:

  BufferedInputStream inputStream = null;
  OutputStream out = null;

  String fileName = null;
  String path = null;
  File savedFile = null;

  try
  {
      // Replace your URL here.
      URL fileURL = new URL("http://enter.your.url.here");
      URLConnection connection = fileURL.openConnection();
      connection.connect();

      inputStream = new java.io.BufferedInputStream(connection.getInputStream());

      // Replace your save path here.
      File fileDir = new File("path/to/save");
      fileDir.mkdirs();
      savedFile = new File("path/to/save", fileName);
      out = new FileOutputStream(savedFile);

      byte buf[] = new byte[1024];
      int len;

      long total = 0;

      while ((len = inputStream.read(buf)) != -1)
      {
        total += len;
        out.write(buf, 0, len);
      }

      out.close();
      inputStream.close();
  }
  catch (Exception)
  {

  }

1

尝试下面的代码。它应该可以正常工作!

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URL;


public class DownloadManager {

    public static void downLoadImage(String imageURL, String destinationFileName) throws IOException {
        URL url = new URL(imageURL);
        InputStream inputStream = url.openStream();
        OutputStream outputStream = new FileOutputStream(destinationFileName);
        byte[] byteData = new byte[2048];
        int length;
        while((length=inputStream.read(byteData))!=-1) {
            outputStream.write(byteData, 0, length);
        }
        inputStream.close();
        outputStream.close();
    }

    public static void main(String[] args) throws IOException {
        String imageURL = "http://sposter.smartag.my/images/KFC_Voucher.jpg";
        String destinationFileName = "C:/Users/sarath_sivan/Desktop/caldophilus.jpg";
        downLoadImage(imageURL, destinationFileName);
    }
}

0

立即尝试这个 -

try {
            url = paths[0];
            HttpURLConnection connection = (HttpURLConnection) url
                    .openConnection();
            int length = connection.getContentLength();
            InputStream is = (InputStream) url.getContent();
            byte[] imageData = new byte[length];
            int buffersize = (int) Math.ceil(length / (double) 100);
            int downloaded = 0;
            int read;
            while (downloaded < length) {
                if (length < buffersize) {
                    read = is.read(imageData, downloaded, length);
                } else if ((length - downloaded) <= buffersize) {
                    read = is.read(imageData, downloaded, length
                            - downloaded);
                } else {
                    read = is.read(imageData, downloaded, buffersize);
                }
                downloaded += read;
                publishProgress((downloaded * 100) / length);
            }
            Bitmap bitmap = BitmapFactory.decodeByteArray(imageData, 0,
                    length);
            if (bitmap != null) {
                Log.i(TAG, "Bitmap created");
            } else {
                Log.i(TAG, "Bitmap not created");
            }
            is.close();
            return bitmap;
        } catch (MalformedURLException e) {
            Log.e(TAG, "Malformed exception: " + e.toString());
        } catch (IOException e) {
            Log.e(TAG, "IOException: " + e.toString());
        } catch (Exception e) {
            Log.e(TAG, "Exception: " + e.toString());
        }

而且,只需看一下这里


-1

In ...

FileOutputStream f = new FileOutputStream(new File(root, FILENAME));

尝试将FILENAME替换为fileURL。 此外,异常抛出在哪一行?这会有所帮助。


我正在使用Galaxy Nexus进行测试,但无法找到导致错误的代码行。如果我将FILENAME更改为fileUrl,则会出现“/mnt/sdcard/http://sposter.smartag.my/images/caldophilus.jpg:open failed:ENOENT(没有这样的文件或目录)”的错误提示。 - chinna_82

-1
String fileURL = "http://sposter.smartag.my/images/KFC_Voucher.jpg";

String FILENAME = "caldophilus.jpg";

URL u = new URL(fileURL);

HttpURLConnection c = (HttpURLConnection) u.openConnection();

c.setRequestMethod("GET");

//c.setDoOutput(true); =========== remove this;

c.connect();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接