2012-03-15 1 views
0

En utilisant le code suivant, je peux charger n'importe quel fichier depuis l'URL comme un octet mais cela fonctionne bien pour un fichier ne dépassant pas 256kb.Télécharger un fichier volumineux via HttpConnection

Je veux une autre façon de charger des fichiers plus volumineux sous forme d'octets sans utiliser BlackBerry Combiner

mon code:

HttpConnection hpc = null; 
    try { 
     hpc = (HttpConnection) Connector.open(url 
       + ConnectionManager.getTimeOut(5000) 
       + ConnectionManager.updateConnectionSuffix()); 
     hpc.setRequestMethod(HttpConnection.GET); 
     hpc.setRequestProperty("Connection", "Keep-Alive"); 
     if (hpc.getResponseCode() != 200) { 
      return null; 
     } 
     byte[] data = IOUtilities.streamToBytes(hpc.openInputStream()); 
     hpc.close(); 
     return data; 
    } catch (Exception e) { 
     return null; 
    } 

Répondre

0

i essayé d'ajuster BlackBerry Combiner à utiliser sur le téléchargement de gros fichiers comme des octets.et il fonctionne très bien pour moi le code ci-dessous

--- appeler

byte[] data = downloadLargeFiles(url); 
       if (data != null) { 
        invoke(data.length + " "); 
        Bitmap bitmap = Bitmap.createBitmapFromBytes(data, 0, 
          data.length, 1); 
        manager.add(new BitmapField(bitmap)); 
       } 

--- la fonction

public byte[] downloadLargeFiles(String url) throws Exception { 
    int chunkIndex = 0; 
    int totalSize = 0; 

    String currentFile = url + ConnectionManager.getTimeOut(5000) 
      + ConnectionManager.updateConnectionSuffix(); 
    HttpConnection conn; 
    InputStream in; 
    int rangeStart = 0; 
    int rangeEnd = 0; 
    int chunksize = 100000; 
    ByteArrayOutputStream bos = new ByteArrayOutputStream(); 

    while (true) { 
     conn = (HttpConnection) Connector.open(currentFile, 
       Connector.READ_WRITE, true); 
     rangeStart = chunkIndex * chunksize; 
     rangeEnd = rangeStart + chunksize - 1; 
     conn.setRequestProperty("Range", "bytes=" + rangeStart + "-" 
       + rangeEnd); 
     int responseCode = conn.getResponseCode(); 
     if (responseCode != 200 && responseCode != 206) { 
      // Dialog.alert("End "+responseCode); 
      break; 
     } 
     in = conn.openInputStream(); 
     int length = -1; 
     byte[] readBlock = new byte[256]; 
     int fileSize = 0; 
     while ((length = in.read(readBlock)) != -1) { 
      bos.write(readBlock, 0, length); 
      fileSize += length; 
      Thread.yield(); // Try not to get cut off 
     } 
     totalSize += fileSize; 
     chunkIndex++; // index (range) increase 
     in.close(); 
     conn.close(); 
     in = null; 
     conn = null; 

     Thread.sleep(1000); 
    } 
    bos.close(); 

    return bos.toByteArray(); 
} 

Merci

1

La limitation est imposée par la MDS, qui est un proxy entre le terminal BlackBerry et l'Internet. Les serveurs BIS et BES sont des serveurs MDS. Ainsi, sans supprimer la limitation, vous devrez diviser vos téléchargements pour qu'ils correspondent à chacun de vos plus gros volumes de données. Le protocole HTTP prend déjà en charge cette fonctionnalité via l'en-tête de la demande Range, comme il est montré dans l'exemple DownloadCombiner, pas besoin de créer votre propre mécanisme. C'est le seul moyen de garantir le téléchargement de fichiers de taille arbitraire.

Cela dit, selon votre cas, il y a des façons de supprimer/contourner la limitation:

  • Si votre appareil se trouve dans un BES, vous pouvez parler à l'administrateur BES pour augmenter les données de téléchargement taille par connexion autant que possible. La valeur maximale disponible dans la configuration BES dépend de la version BES, donc même au maximum, elle peut ne pas être suffisante pour télécharger des fichiers dépassant cette limite. (Mais si vos fichiers sont plus petits que la limite, alors c'est le moyen le plus rapide de télécharger des fichiers sans modifier le code).

  • Si vous testez dans un simulateur dans votre machine locale, recherchez ce fichier:

    <JDE path>\MDS\config\rimpublic.property<br><br> 
    

    Localisez la ligne IPPP.connection.MaxNumberOfKBytesToSend et augmenter pour répondre à vos besoins. Ce n'est pas une bonne pratique car votre application fonctionnera correctement dans les simulateurs mais échouera sur les vrais appareils. Il est toujours souhaitable de garder le comportement de votre simulateur aussi proche que possible des dispositifs réels.

  • Si vous êtes sur BIS, les limites sont fixes et varient en fonction du type MIME renvoyé dans la réponse HTTP, comme cela est expliqué here. Les types MIME multimédias ont la plus grande limite de taille à 122 880 Ko. Donc, si vous devez télécharger, disons, un fichier pdf de plus de 2048 Ko d'un serveur sous votre contrôle, vous pouvez devenir hackish, renommer le fichier en extension multimédia, changer le type MIME retourné dans la réponse à un multimédia , puis une fois téléchargé sur votre appareil, renommez à son extension d'origine. Si le serveur hébergeant le fichier n'est pas sous votre contrôle, vous pouvez configurer un serveur proxy entre le télécharger et servir le fichier falsifié sur l'appareil. C'est trop un travail comme vous pouvez le voir, il est beaucoup plus rapide d'utiliser le DownloadCombiner. Vous devez encore résoudre le problème de connaître l'extension réelle du fichier d'origine. Et finalement vous êtes coincé avec 122,880 Ko, donc cela ne fonctionne pas pour les fichiers dépassant cette taille.

+0

réponse Grand. Je n'étais pas au courant de la restriction de taille et je pensais que le problème était dû à 'IOUtilities.streamToBytes (hpc.openInputStream())'. Existe-t-il une restriction similaire sur le téléchargement? – mrvincenzo

+0

le code que j'ai posté ci-dessus utilise cette méthode IOUtilities.streamToBytes (hpc.openInputStream()) et ne fonctionne toujours pas. alors pourquoi le problème se produit. –

+0

@ahmed Shoeib Le 413 se produit lorsque la connexion est établie ('getResponseCode' dans votre fiche), et non lorsque vous dépassez la limite de téléchargement. –

Questions connexes