1

Je ne sais pas si je suis en train d'envoyer mon fichier directement à l'API web. Parce que rien ne donne une erreur au client code de demande. Mais quand je reçois la réponse au serveur il me donne une exception java.io.FileNotFoundException. Donc, je pense qu'il ya un problème dans mon code de demande parce qu'il ne télécharge aucun fichier sur le serveur web et je pense que c'est pourquoi je reçois le java.io.FileNotFoundException. S'il vous plaît aidez-moi à ce merci.Pourquoi j'obtiens java.io.FileNotFoundException pour obtenir la réponse à mon httpUrlConnection?

HttpURLConnection conn = null; 
    DataOutputStream dos = null; 

    String samplefile = "storage/sdcard0/Pictures/Images/productshot.jpg"; 
    String urlString = "http://avasd.server.com.ph:1217/api/fileupload";  

     File mFile = new File(samplefile); 

     int mychunkSize = 2048 * 1024; 
     final long size = mFile.length(); 
     final long chunks = size < mychunkSize? 1: (mFile.length()/mychunkSize); 

     int chunkId = 0; 


     int bytesRead, bytesAvailable, bufferSize; 

     byte[] buffer; 

     int maxBufferSize = 2 * 1024 * 1024; 
     try { 
      //Client Request 

      FileInputStream stream = new FileInputStream(mFile); 

      String lineEnd = "\r\n"; 
      String twoHyphens = "--"; 
      String boundary = "-------------------------acebdf13572468";// random data 

      String param1 = ""+chunkId; 
      String param2 = ""+chunks; 
      String param3 = mFile.getName(); 
      String param4 = samplefile; 

      for (chunkId = 0; chunkId < chunks; chunkId++) { 

       URL url = new URL(urlString); 

       // Open a HTTP connection to the URL 
       conn = (HttpURLConnection) url.openConnection(); 

       conn.setReadTimeout(20000 /* milliseconds */); 
       conn.setConnectTimeout(20000 /* milliseconds */); 


       // Allow Inputs 
       conn.setDoInput(true); 
       // Allow Outputs 
       conn.setDoOutput(true); 
       // Don't use a cached copy. 
       conn.setUseCaches(false); 
       // Use a post method. 
       conn.setRequestMethod("POST"); 


       String encoded = Base64.encodeToString((_username+":"+_password).getBytes(),Base64.NO_WRAP); 
       conn.setRequestProperty("Authorization", "Basic "+encoded); 
       conn.setRequestProperty("Connection", "Keep-Alive"); 
       conn.setChunkedStreamingMode(0); 
       conn.setRequestProperty("Content-Type", "multipart/form-data;boundary="+boundary); 
       int length = (int) (param2.length() + param3.length() + mFile.length() + encoded.length() + lineEnd.length() + twoHyphens.length() + boundary.length()); 
       conn.connect(); 
       dos = new DataOutputStream(conn.getOutputStream()); 
       dos.writeBytes(twoHyphens + boundary + lineEnd); 


       // Send parameter #file 
       dos.writeBytes("Content-Disposition: form-data; name=\"fieldNameHere\";filename=\"" + mFile.getName() + "\"" + lineEnd); // filename is the Name of the File to be uploaded 
       dos.writeBytes("Content-Type: image/jpeg" + lineEnd); 
       dos.writeBytes(lineEnd); 


       // Send parameter #chunks 
       dos.writeBytes("Content-Disposition: form-data; name=\"chunk\"" + lineEnd); 
       dos.writeBytes(param2 + lineEnd); 
       dos.writeBytes(twoHyphens + boundary + lineEnd); 


       // Send parameter #name 
       dos.writeBytes("Content-Disposition: form-data; name=\"name\"" + lineEnd); 
       dos.writeBytes(param3 + lineEnd); 
       dos.writeBytes(twoHyphens + boundary + lineEnd); 


       bytesAvailable = stream.available(); 
       bufferSize = Math.min(bytesAvailable, maxBufferSize); 
       buffer = new byte[bufferSize]; 
       // read file and write it into form... 
       bytesRead = stream.read(buffer, 0, bufferSize); 


       while (bytesRead > 0) { 
        dos.write(buffer, 0, bufferSize); 
        bytesAvailable = stream.available(); 
        bufferSize = Math.min(bytesAvailable, maxBufferSize); 
        bytesRead = stream.read(buffer, 0, bufferSize); 
        Log.i("BytesAvailable", String.valueOf(bytesAvailable)); 
        Log.i("bufferSize", String.valueOf(bufferSize)); 
        Log.i("Bytes Read", String.valueOf(bytesRead)); 
        Log.i("buffer", String.valueOf(buffer)); 
       } 
       // send multipart form data necesssary after file data... 

       dos.writeBytes(lineEnd); 
       dos.writeBytes(twoHyphens + boundary + twoHyphens + lineEnd); 
       // close streams 

       stream.close(); 
       dos.flush(); 
       dos.close(); 
       Log.i("DOS: ", String.valueOf(dos.size())); 


      } 

     } catch (MalformedURLException ex) { 
      System.out.println("From CLIENT REQUEST:" + ex); 
     }catch (IOException ioe) { 
      System.out.println("From CLIENT REQUEST:" + ioe); 
     }catch (Exception e) { 
      Log.e("From CLIENT REQUEST:", e.toString()); 
     } 


     //Server Response 
     try { 
      System.out.println("Server response is: \n"); 
      DataInputStream inStream = new DataInputStream(conn.getInputStream()); 
      String str; 
      while ((str = inStream.readLine()) != null) { 
      System.out.println(str); 
      System.out.println(""); 
      } 
      inStream.close(); 
      System.out.println("\nEND Server response "); 

      } catch (IOException ioex) { 
      System.out.println("From (ServerResponse): " + ioex); 

      } 
+0

Pouvez-vous poster le logcat parce que vous avez décrit, il est bizarre pour un 'FileNotFoundException' jeté dans la partie "réponse du serveur". – user2652394

+1

Voici mon logcat: 08-14 17: 06: 56.843: I/System.out (22488): De (ServerResponse): java.io.FileNotFoundException: http://avasd.server.com.ph:1217/api/ fileupload – NewDroidDev

+0

C'est bizarre, mais je pense que quand vous 'dos.close();' le 'conn' est également fermé. Essayez de fermer dos après la réponse du serveur. J'espère que cela t'aides. – user2652394

Répondre

0

Je pense avant d'écrire des données dans le fichier, vous devez vous assurer que le parent de la variable de fichier est available.You peut voir le code ci-dessous:

/** 
* 
* @param path 
*   like '/abc/temp' which will retutn '/mnt/sdcard/abc/temp' 
* @return 
*/ 
public static File getFile(String path) { 
    File file = new File(Environment.getExternalStorageDirectory() + path); 
    File parent = file.getParentFile(); 
    if (!parent.exists()) { 
     parent.mkdirs(); 
    } 
    if (!file.exists()) { 
     try { 
      file.createNewFile(); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 
    return file; 
} 

Ceci est une fonction que je l'utilise souvent. J'espère que ça va aider.

+0

mon fichier est disponible l'erreur que j'ai eu est de la réponse du serveur. – NewDroidDev

+0

Non Cette exception est liée au code Java comme vous pouvez le voir par son nom ** java.io.FileNotFoundException ** donc soit vous envoyez cette déclaration d'exception au serveur au lieu du fichier et le serveur renvoie simplement en réponse –

+0

que voulez-vous dire? ? Y at-il quelque chose qui ne va pas comment je passe mon fichier sur le serveur web s'il vous plaît aidez-moi. – NewDroidDev

0

contrôle la permission de votre manifest.xml vous devez ajouter l'autorisation d'accéder à l'emplacement de mémoire sdcard0: essayer cette

Questions connexes