0

I am using the following code to receive file from another user

FileTransferManager fm  = new FileTransferManager(xmppConnection);
fm.addFileTransferListener(new FileTransferListener() {

    public void fileTransferRequest(final FileTransferRequest request) {
        Log.i("XMPPClient", "fileTransferRequest ");
        new Thread() {
            @Override
            public void run() {
                IncomingFileTransfer transfer = request.accept();
                Log.i("XMPPClient", "IncomingFileTransfer " + transfer);
                File mf = Environment.getExternalStorageDirectory();
                File file = new File(mf + "/" + transfer.getFileName());
                try {
                    transfer.recieveFile(file);
                    while(!transfer.isDone()) {
                        Log.i("XMPPClient", "while..... ");
                        try {
                            Thread.sleep(1000L);
                        } catch (Exception e) {
                            Log.e("XMPPClient", e.getMessage());
                        }
                        if (transfer.getStatus().equals(
                                org.jivesoftware.smackx.filetransfer.FileTransfer.Status.error)) {
                            Log.e("ERROR!!! ", transfer.getError() + "");
                        }
                        if (transfer.getException() != null) {
                            transfer.getException().printStackTrace();
                        }
                    }
                } catch (Exception e) {
                    Log.e("XMPPClient", e.getMessage());
                }
            };
        }.start();
    }
});

} catch (IllegalStateException e) {
    e.printStackTrace();
} 

I have written this code in the launcher activity of my application.Also in the launcher activity, I have written code to send the file on button click. I am running this application on two different devices say A and B. From A , I am sending the file on button click and file is transferred from device A . But the file is not received in device B even it is not showing any log messages or any error

What is the issue?

Terry
  • 14,529
  • 13
  • 63
  • 88
Prabhu M
  • 3,534
  • 8
  • 48
  • 87
  • this file transfer from smack is very heavy, we made our own. the problem was we had to enable file transfer on the server (openfire) and before the connection had to set the ProviderManager because the library doesn't load a providers. If I remember correctly you can do it manually like the answer shows below(user3532467) or you can use SmackAndroid.init(context); – cesztoszule Apr 24 '14 at 12:29
  • Yes file transfer of openfire using asmack is not good, you need to create your own plugin for openfire – Jaspreet Chhabra Apr 24 '14 at 12:35
  • Can u please give me any hint on creating own plugin for file transfer in openfire – Prabhu M Apr 24 '14 at 12:41
  • @PrabhuM I am also struggling with this issue to transfer the files through openfire. Were you able to resolve the issues ? If yes, then would you like to share the details with me too . – WannaBeGeek Nov 17 '14 at 09:38
  • @Kanchan I am using different approach to transfer file. When User browse and select file, I am just uploading the file to our server and sending file location on server as a normal text message to the recipient and in recipient device I am just downloading the file from the location – Prabhu M Nov 17 '14 at 10:07
  • ok thanks for replying . Can you tell me about any problems that can arise if I followed this approach ? – WannaBeGeek Nov 17 '14 at 10:21
  • I dont think so.I guess even watsapp follows this approach – Prabhu M Nov 18 '14 at 07:23
  • @PrabhuM Hi . I would like to know one more thing . Which database you are using ? – WannaBeGeek Nov 20 '14 at 16:05
  • @Kanchan mysql databse – Prabhu M Nov 21 '14 at 04:50
  • @PrabhuM I am not able to find any tutorial for using its embedded database . Can you please share if you know about any tutorials on this. – WannaBeGeek Nov 21 '14 at 06:23
  • https://www.igniterealtime.org/builds/openfire/docs/latest/documentation/db-integration-guide.html – Prabhu M Nov 21 '14 at 10:32
  • @PrabhuM I am not talking about custom database. I want to use the embedded HSQLDB of openfire . – WannaBeGeek Nov 21 '14 at 11:32
  • @Kanchan I dont have any idea on embedded HSQLDB – Prabhu M Nov 24 '14 at 05:19
  • @PrabhuM ok . Anyways , thanks for answering my all questions ! – WannaBeGeek Nov 24 '14 at 05:23

3 Answers3

1

Asmack file transfer is not good you should create the plugin to upload a file on server and return a url using that..

the plugin servelet will look like

package org.jivesoftware.openfire.plugin.fileupload;




import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.util.List;

import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.apache.commons.io.FilenameUtils;
import org.apache.log4j.Logger;
import org.jivesoftware.admin.AuthCheckFilter;
import org.jivesoftware.openfire.XMPPServer;
import org.jivesoftware.openfire.plugin.Fileupload;



    /**

     *
     * @author Jaspreet
     */
    public class FileUploadServlet extends HttpServlet {

        private Fileupload plugin;
        private static Logger Log = Logger.getLogger(Fileupload.class);
        protected long amountWritten = -1;
        private static final int BUFFER_SIZE = 8192;
        @Override
        public void init(ServletConfig servletConfig) throws ServletException {
            super.init(servletConfig);
            plugin = (Fileupload) XMPPServer.getInstance().getPluginManager().getPlugin("fileupload");
     Log.info("File upload  plugin" +plugin.getClass());
            // Exclude this servlet from requiring the user to login
            AuthCheckFilter.addExclude("fileupload/userservice");
            Log.info("Fileupload  plugin   AuthCheckFilter.addExclude" );
        }

        @Override
        protected void doGet(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException
        {
            PrintWriter out = response.getWriter();
            try{
            Log.info("response HttpServletRequest ok");


             String name=request.getParameter("name");
             String type=request.getParameter("type");
             Log.info("type = "+type);
             Log.info("name = "+name);
             if (type.equals("download")) {
                 Log.info("line 68");
                 OutputStream outputStream=response.getOutputStream();
                FileInputStream fileInputStream=new FileInputStream(Fileupload.directory+"/"+name);
                 Log.info("line 72 ");
                sendFile(response, outputStream, fileInputStream);
                 Log.info("line 73");
                 return;
             } 

            }catch (Exception e) {
                // TODO: handle exception
                replyMessage("error", response, out);
                Log.error("error while downloading file");
            Log.info("error = "+e.getMessage());
            }
            }
        @Override
        protected void doPost(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {


            /* String type = request.getHeader("type_");
             String name=request.getHeader("name");
             Log.info("type = "+type);
             Log.info("name = "+name);
            if(type.equals("upload")){*/
             PrintWriter out = response.getWriter();
                 try {
                     Log.info("line 93");

                        List<FileItem> items = new ServletFileUpload(new DiskFileItemFactory()).parseRequest(request);
                        Log.info("line 94");
                        for (FileItem item : items) {
                            Log.info("line 96");
                            if (item.isFormField()) {
                                Log.info("line 98");
                                // Process regular form field (input type="text|radio|checkbox|etc", select, etc).
                                String fieldname = item.getFieldName();
                                String fieldvalue = item.getString();
                                // ... (do your job here)
                            } else {
                                // Process form file field (input type="file").
                                Log.info("line 105");
                                String fieldname = item.getFieldName();
                                String filename = FilenameUtils.getName(item.getName());
                                Log.info("line 108");
                                InputStream filecontent = item.getInputStream();
                                Log.info("line 110");
                               // InputStream inputStream=(InputStream) request.getAttribute("uploaded");
                                //InputStream inputStream=request.getInputStream();
                                File file = new File(Fileupload.directory+"/"+filename);
                                if(!file.exists()){
                                    file.createNewFile();
                                }
    //                          File file = new File(filename);
                                Log.info("line 114");
                                FileOutputStream fop = new FileOutputStream(file);
                                Log.info("line 116");
                                uploadFile(response, fop, filecontent);
                                Log.info("line 118");
    //                          replyMessage("error", response, out);
                                replyMessage("your server url /plugins/fileupload/userservice?type=download&name="+filename, response, out);
                            }
                        }
                    } catch (Exception e) {
                        replyMessage("error", response, out);
                        Log.error("error while uploading file");
                        throw new ServletException("Cannot parse multipart request.", e);
                    }

            /*  InputStream inputStream=(InputStream) request.getAttribute("uploaded");
                //InputStream inputStream=request.getInputStream();
                File file = new File(name);
                FileOutputStream fop = new FileOutputStream(file);
                uploadFile(response, fop, inputStream);*/

            // }


        }
        private void replyMessage(String message,HttpServletResponse response, PrintWriter out){
            response.setContentType("text/xml");        
            out.println("{\"result\":\"" + message + "\"}");
            out.flush();
        }

        private void uploadFile(HttpServletResponse response, OutputStream out,InputStream inputStream){


            final byte[] b = new byte[BUFFER_SIZE];
            int count = 0;
            amountWritten = 0;

            do {
                // write to the output stream
                try {
                    out.write(b, 0, count);
                } catch (IOException e) {
                }

                amountWritten += count;

                // read more bytes from the input stream
                try {
                    count = inputStream.read(b);
                } catch (IOException e) {
                    Log.info("error = "+e.getMessage());
                }
            } while (count != -1 );
            try {
                out.flush();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
                Log.info("error = "+e.getMessage());
            }
            // the connection was likely terminated abrubtly if these are not equal




        }
        private void sendFile(HttpServletResponse response, OutputStream out,FileInputStream inputStream){

            try{
            response.setContentType("video/mp4");      


            final byte[] b = new byte[BUFFER_SIZE];
            int count = 0;
            amountWritten = 0;

            do {
                // write to the output stream
                try {
                    out.write(b, 0, count);
                } catch (IOException e) {
                    //throw new XMPPException("error writing to output stream", e);
                }

                amountWritten += count;

                // read more bytes from the input stream
                try {
                    count = inputStream.read(b);
                } catch (IOException e) {
                    //throw new XMPPException("error reading from input stream", e);
                }
            } while (count != -1 );

            }catch (Exception e) {
                // TODO: handle exception
                Log.info("error = "+e.getMessage());
            }
            try {
                response.flushBuffer();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
           // out.flush();
        }
        private void replyError(String error,HttpServletResponse response, PrintWriter out){
            response.setContentType("text/xml");        
            out.println("<error>" + error + "</error>");
            out.flush();
        }



        @Override
        public void destroy() {
            super.destroy();
            // Release the excluded URL
         //   AuthCheckFilter.removeExclude("userService/userservice");
        }
    }
Jaspreet Chhabra
  • 1,431
  • 15
  • 23
  • what to do next after I upload file to server and get back that uploaded url – Prabhu M Apr 24 '14 at 12:50
  • I am developing a chat application. Now I am able to do text chat. I want to support file transfer in my chat application, so I thought of using openfire file transfer. But you have suggested plugin, Can u please explain me the flow of using plugin for file transfer – Prabhu M Apr 24 '14 at 12:59
  • 1
    Ok, create a plugin that upload the file on the server, when the server reply the URL you need to send that url to the second user, you can send that in the body with some special character prefix it so that receiver can identity. second user can download the file and can save it on the database – Jaspreet Chhabra Apr 24 '14 at 13:19
  • 1
    here is the link that will guild you how to create plugin on open fire http://www.igniterealtime.org/builds/openfire/docs/latest/documentation/plugin-dev-guide.html – Jaspreet Chhabra Apr 24 '14 at 13:20
  • I am using Vcard to store information of user like image , phone, email etc. Similarly Can we use Vcard for MUC group in openfire – Prabhu M Apr 24 '14 at 13:34
  • No, but you can create a plugin for this also, just you have to extend vcard – Jaspreet Chhabra Apr 24 '14 at 13:36
  • Ok . If I get any doubts I will ask ur suggestion – Prabhu M Apr 24 '14 at 13:47
  • @JaspreetChhabra sir need your help..? – Nikhil Borad Jul 26 '16 at 07:49
0

I created it in this way

package org.jivesoftware.openfire.plugin;

import java.io.File;
import java.io.IOException;

import org.apache.log4j.Logger;

import org.jivesoftware.openfire.container.Plugin;
import org.jivesoftware.openfire.container.PluginManager;


public class Fileupload implements Plugin {

    private static Logger Log = Logger.getLogger(Fileupload.class);
    public static String directory="/usr/share/openfire/resources/videos";
    public void initializePlugin(PluginManager manager, File pluginDirectory) {
        try{
        File file=new File(directory);
        file.mkdir();
        }catch (Exception e) {
            // TODO: handle exception
            Log.info("error while creating ../resources/Videos= "+ e.getMessage());
        }
    }



    public void destroyPlugin() {
    }

}
Jaspreet Chhabra
  • 1,431
  • 15
  • 23
-1

I think you have not added provider for the same

Add this method after login

private static void Configure(Context context) {
        try {
            ProviderManager pm = ProviderManager.getInstance();
            pm.addIQProvider("query", "urn:xmpp:groupvcard",
                    new GroupInfoVcard.Provider(context));
            pm.addIQProvider("query", "jabber:iq:search",
                    new SearchItem.Provider(context));
            System.out.println("SearchItem added");
            pm.addExtensionProvider("x", "jabber:x:data", new DataFormProvider());
            pm.addIQProvider("vCard", "vcard-temp", new VCardProvider());
            pm = ProviderManager.getInstance();
            pm.addExtensionProvider("active",
                    "http://jabber.org/protocol/chatstates",
                    new ChatStateExtension.Provider());
            pm.addExtensionProvider("composing",
                    "http://jabber.org/protocol/chatstates",
                    new ChatStateExtension.Provider());
            pm.addExtensionProvider("paused",
                    "http://jabber.org/protocol/chatstates",
                    new ChatStateExtension.Provider());
            pm.addExtensionProvider("inactive",
                    "http://jabber.org/protocol/chatstates",
                    new ChatStateExtension.Provider());
            pm.addExtensionProvider("gone",
                    "http://jabber.org/protocol/chatstates",
                    new ChatStateExtension.Provider());
            Log.e("DeliveryReceipt.ELEMENT", DeliveryReceipt.ELEMENT);
            pm.addExtensionProvider(DeliveryReceipt.ELEMENT,
                    DeliveryReceipt.NAMESPACE, new DeliveryReceipt.Provider());
            pm.addIQProvider("list", "urn:xmpp:archive", new ListIQProvider(context));
            pm.addIQProvider("chat", "urn:xmpp:archive", new ChatIQProvider());
            System.out.println("ping provider added");

            pm.addIQProvider("ping", "urn:xmpp:ping", new PingProvider());
            System.out.println("ping provider added end");
            pm.addExtensionProvider(DeliveryReceiptRequest.ELEMENT,
                    DeliveryReceipt.NAMESPACE,
                    new DeliveryReceiptRequest.Provider());

            pm.addIQProvider("query", "jabber:iq:private",
                    new PrivateDataManager.PrivateDataIQProvider());
            // Time
            try {
                pm.addIQProvider("query", "jabber:iq:time",
                        Class.forName("org.jivesoftware.smackx.packet.Time"));
            } catch (ClassNotFoundException e) {
                System.err
                        .println("Can't load class for org.jivesoftware.smackx.packet.Time");
            }

            // Roster Exchange
            pm.addExtensionProvider("x", "jabber:x:roster",
                    new RosterExchangeProvider());
            // Message Events
            pm.addExtensionProvider("x", "jabber:x:event",
                    new MessageEventProvider());
            // Chat State
            pm.addExtensionProvider("active",
                    "http://jabber.org/protocol/chatstates",
                    new ChatStateExtension.Provider());
            pm.addExtensionProvider("composing",
                    "http://jabber.org/protocol/chatstates",
                    new ChatStateExtension.Provider());
            pm.addExtensionProvider("paused",
                    "http://jabber.org/protocol/chatstates",
                    new ChatStateExtension.Provider());
            pm.addExtensionProvider("inactive",
                    "http://jabber.org/protocol/chatstates",
                    new ChatStateExtension.Provider());
            pm.addExtensionProvider("gone",
                    "http://jabber.org/protocol/chatstates",
                    new ChatStateExtension.Provider());

            // XHTML
            pm.addExtensionProvider("html", "http://jabber.org/protocol/xhtml-im",
                    new XHTMLExtensionProvider());

            // Group Chat Invitations
            pm.addExtensionProvider("x", "jabber:x:conference",
                    new GroupChatInvitation.Provider());

            // Service Discovery # Items
            pm.addIQProvider("query", "http://jabber.org/protocol/disco#items",
                    new DiscoverItemsProvider());
            // Service Discovery # Info
            pm.addIQProvider("query", "http://jabber.org/protocol/disco#info",
                    new DiscoverInfoProvider());
            // Data Forms
            pm.addExtensionProvider("x", "jabber:x:data", new DataFormProvider());
            // MUC User
            pm.addExtensionProvider("x", "http://jabber.org/protocol/muc#user",
                    new MUCUserProvider());
            // MUC Admin
            pm.addIQProvider("query", "http://jabber.org/protocol/muc#admin",
                    new MUCAdminProvider());
            // MUC Owner
            pm.addIQProvider("query", "http://jabber.org/protocol/muc#owner",
                    new MUCOwnerProvider());
            // Delayed Delivery
            pm.addExtensionProvider("x", "jabber:x:delay",
                    new DelayInformationProvider());
            pm.addExtensionProvider("delay", "urn:xmpp:delay",
                    new DelayInformationProvider());
            // Version
            try {
                pm.addIQProvider("query", "jabber:iq:version",
                        Class.forName("org.jivesoftware.smackx.packet.Version"));
            } catch (ClassNotFoundException e) {
                System.err
                        .println("Can't load class for org.jivesoftware.smackx.packet.Version");
            }
            // VCard
            pm.addIQProvider("vCard", "vcard-temp", new VCardProvider());
            // Message Requests
            pm.addIQProvider("offline", "http://jabber.org/protocol/offline",
                    new OfflineMessageRequest.Provider());
            // Offline Message Indicator
            System.out.println("offline provider added");
            pm.addExtensionProvider("offline",
                    "http://jabber.org/protocol/offline",
                    new OfflineMessageInfo.Provider());
            // Last Activity
            pm.addIQProvider("query", "jabber:iq:last", new LastActivity.Provider());
            // SharedGroupsInfo
            pm.addIQProvider("sharedgroup",
                    "http://www.jivesoftware.org/protocol/sharedgroup",
                    new SharedGroupsInfo.Provider());

            // JEP-33: Extended Stanza Addressing
            pm.addExtensionProvider("addresses",
                    "http://jabber.org/protocol/address",
                    new MultipleAddressesProvider());

            // FileTransfer
            pm.addIQProvider("si", "http://jabber.org/protocol/si",
                    new StreamInitiationProvider());
            pm.addIQProvider("query", "http://jabber.org/protocol/bytestreams",
                    new BytestreamsProvider());
            pm.addIQProvider("open", "http://jabber.org/protocol/ibb",
                    new OpenIQProvider());
            pm.addIQProvider("data", "http://jabber.org/protocol/ibb",
                    new DataPacketProvider());
            pm.addIQProvider("close", "http://jabber.org/protocol/ibb",
                    new CloseIQProvider());
            pm.addExtensionProvider("data", "http://jabber.org/protocol/ibb",
                    new DataPacketProvider());

            // Privacy
            pm.addIQProvider("query", "jabber:iq:privacy", new PrivacyProvider());

            // SHIM
            pm.addExtensionProvider("headers", "http://jabber.org/protocol/shim",
                    new HeadersProvider());
            pm.addExtensionProvider("header", "http://jabber.org/protocol/shim",
                    new HeaderProvider());

            // PubSub
            pm.addIQProvider("pubsub", "http://jabber.org/protocol/pubsub",
                    new PubSubProvider());
            pm.addExtensionProvider("create", "http://jabber.org/protocol/pubsub",
                    new SimpleNodeProvider());
            pm.addExtensionProvider("items", "http://jabber.org/protocol/pubsub",
                    new ItemsProvider());
            pm.addExtensionProvider("item", "http://jabber.org/protocol/pubsub",
                    new ItemProvider());
            pm.addExtensionProvider("subscriptions",
                    "http://jabber.org/protocol/pubsub",
                    new SubscriptionsProvider());
            pm.addExtensionProvider("subscription",
                    "http://jabber.org/protocol/pubsub", new SubscriptionProvider());
            pm.addExtensionProvider("affiliations",
                    "http://jabber.org/protocol/pubsub", new AffiliationsProvider());
            pm.addExtensionProvider("affiliation",
                    "http://jabber.org/protocol/pubsub", new AffiliationProvider());
            pm.addExtensionProvider("options", "http://jabber.org/protocol/pubsub",
                    new FormNodeProvider());
            // PubSub owner
            pm.addIQProvider("pubsub", "http://jabber.org/protocol/pubsub#owner",
                    new PubSubProvider());
            pm.addExtensionProvider("configure",
                    "http://jabber.org/protocol/pubsub#owner",
                    new FormNodeProvider());
            pm.addExtensionProvider("default",
                    "http://jabber.org/protocol/pubsub#owner",
                    new FormNodeProvider());
            // PubSub event
            pm.addExtensionProvider("event",
                    "http://jabber.org/protocol/pubsub#event", new EventProvider());
            pm.addExtensionProvider("configuration",
                    "http://jabber.org/protocol/pubsub#event",
                    new ConfigEventProvider());
            pm.addExtensionProvider("delete",
                    "http://jabber.org/protocol/pubsub#event",
                    new SimpleNodeProvider());
            pm.addExtensionProvider("options",
                    "http://jabber.org/protocol/pubsub#event",
                    new FormNodeProvider());
            pm.addExtensionProvider("items",
                    "http://jabber.org/protocol/pubsub#event", new ItemsProvider());
            pm.addExtensionProvider("item",
                    "http://jabber.org/protocol/pubsub#event", new ItemProvider());
            pm.addExtensionProvider("retract",
                    "http://jabber.org/protocol/pubsub#event",
                    new RetractEventProvider());
            pm.addExtensionProvider("purge",
                    "http://jabber.org/protocol/pubsub#event",
                    new SimpleNodeProvider());

            // Nick Exchange
            pm.addExtensionProvider("nick", "http://jabber.org/protocol/nick",
                    new Nick.Provider());

            // Attention
            pm.addExtensionProvider("attention", "urn:xmpp:attention:0",
                    new AttentionExtension.Provider());

            // XEP-184 Message Delivery Receipts
            pm.addExtensionProvider("received", "urn:xmpp:receipts",
                    new DeliveryReceipt.Provider());
            pm.addExtensionProvider("request", "urn:xmpp:receipts",
                    new DeliveryReceipt.Provider());

            pm.addIQProvider("query", "http://jabber.org/protocol/bytestreams",
                    new BytestreamsProvider());
            pm.addIQProvider("query", "http://jabber.org/protocol/disco#items",
                    new DiscoverItemsProvider());
            pm.addIQProvider("query", "http://jabber.org/protocol/disco#info",
                    new DiscoverInfoProvider());

            /*pm.addIQProvider("offline", "http://jabber.org/protocol/offline",
                    new OfflineMessageRequest.Provider());
            // Offline Message Indicator
            pm.addExtensionProvider("offline",
                    "http://jabber.org/protocol/offline",
                    new OfflineMessageInfo.Provider());*/
            pm.addExtensionProvider("x", "jabber:x:data", new DataFormProvider());
            pm.addIQProvider("vCard", "vcard-temp", new VCardProvider());
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }
Jaspreet Chhabra
  • 1,431
  • 15
  • 23
  • Manually adding the providers is not longer necessary in recent aSmack versions. – Flow Apr 24 '14 at 19:23
  • Hi, I am using asmack latest version, you have to add the providers for archive, multi user chat and file transfer check this and make it 0 from -1 – Jaspreet Chhabra Apr 25 '14 at 07:38
  • @Flow do you mind have a look on my question? [link](http://stackoverflow.com/questions/23489617/asmack-file-transfer-progress-always-at-0-0) Thanks! – Kaoru May 07 '14 at 14:18