Android, прочитайте двоичные данные и запишите их в файл - PullRequest
0 голосов
/ 17 февраля 2011

Я пытаюсь прочитать файл изображения с сервера, с кодом ниже.Это продолжает входить в исключение.Я знаю, что отправляется правильное количество байтов, поскольку я их распечатываю при получении.Я отправляю файл изображения из python, например:

#open the image file and read it into an object
        imgfile = open (marked_image, 'rb')  
        obj = imgfile.read()

       #get the no of bytes in the image and convert it to a string
        bytes = str(len(obj))


        #send the number of bytes
        self.conn.send( bytes + '\n')




        if self.conn.sendall(obj) == None:
            imgfile.flush()
            imgfile.close()
            print 'Image Sent'
        else:
            print 'Error'

Вот часть Android, вот где у меня проблема.Любые предложения о том, как лучше всего получить изображение и записать его в файл?

//read the number of bytes in the image
       String noOfBytes =  in.readLine();


       Toast.makeText(this, noOfBytes, 5).show();

       byte bytes [] = new byte [Integer.parseInt(noOfBytes)];

       //create a file to store the retrieved image
       File photo = new File(Environment.getExternalStorageDirectory(),  "PostKey.jpg");

       DataInputStream dis = new DataInputStream(link.getInputStream());
       try{


        os =new FileOutputStream(photo);

        byte buf[]=new byte[1024];

        int len;

        while((len=dis.read(buf))>0)
        os.write(buf,0,len);

        Toast.makeText(this, "File recieved", 5).show();

        os.close();
        dis.close();
       }catch(IOException e){

           Toast.makeText(this, "An IO  Error Occured", 5).show();
       }

РЕДАКТИРОВАТЬ: Я все еще не могу заставить его работать.С тех пор я занимался этим, и результатом всех моих усилий стал либо файл не полного размера, либо приложение зависало.Я знаю, что файл не поврежден перед отправкой на стороне сервера.Насколько я могу сказать, его отправка тоже определенно, так как метод send all в python отправляет all или выдает исключение в случае ошибки, и до сих пор он никогда не генерировал исключение.Таким образом, клиентская сторона запуталась.Мне нужно отправить файл с сервера, чтобы я не смог воспользоваться предложением Брайана.

Ответы [ 3 ]

1 голос
/ 17 февраля 2011

Лучший способ получить растровое изображение с сервера - выполнить следующее.

HttpClient client = new DefaultHttpClient();

HttpGet get = new HttpGet("http://yoururl");

HttpResponse response = client.execute(get);
InputStream is = response.getEntity().getContent();

Bitmap image = BitmapFactory.decodeStream(is);

Это даст вам ваше растровое изображение, чтобы сохранить его в файл, выполните что-то вроде следующего.

FileOutputStream fos = new FileOutputStream("yourfilename");
image.compress(CompressFormat.PNG, 1, fos);
fos.close();

Вы также можете объединить два и просто записать прямо на диск

HttpClient client = new DefaultHttpClient();

HttpGet get = new HttpGet("http://yoururl");

HttpResponse response = client.execute(get);
InputStream is = response.getEntity().getContent();

FileOutputStream fos = new FileOutputStream("yourfilename");

byte[] buffer = new byte[256];
int read = is.read(buffer);

while(read != -1){
    fos.write(buffer, 0, read);
    read = is.read(buffer);
}

fos.close();
is.close();

Надеюсь, это поможет;

0 голосов
/ 19 февраля 2011

Я решил это с помощью участника форумов Ubuntu.Проблема была в чтении байтов.Он вырезал некоторые байты из изображения.Решением было просто отправить изображение целиком и убрать отправку байтов из уравнения все вместе

0 голосов
/ 17 февраля 2011

Я не уверен, что понимаю ваш код.Вы звоните dis.readFully(bytes);, чтобы записать содержимое dis в ваш массив byte.Но тогда вы ничего не делаете с массивом, а затем пытаетесь записать содержимое dis через буфер в ваш FileOutputStream.

Попробуйте закомментировать строку dis.readFully(bytes);.

В качестве дополнительного примечания я бы записывал в журнал, а не выскакивал тост за такие вещи, как количество байтов или при возникновении исключения:

...
} catch (IOException e) {
    Log.e("MyTagName","Exception caught " + e.toString());
    e.printStackTrace();
}

Вы можете посмотреть эти ссылки в качестве примеровзаписи файла на SD-карту:

...