java 安卓上传文件

本文介绍了通过FTP协议和HTTP接口实现文件上传、下载及删除的方法。对于FTP操作,包括了连接配置、文件交互流程及异常处理等内容。同时,还展示了如何使用Retrofit和OkHttp进行HTTP文件上传,并给出了服务端的具体实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1 ftp协议上传文件(需要有文件服务器)
1.1上传文件
 /**
     * 上传文件(可供Action/Controller层使用)
     * @param hostname FTP服务器地址
     * @param port  FTP服务器端口号
     * @param username  FTP登录帐号
     * @param password  FTP登录密码
     * @param pathname  FTP服务器保存目录
     * @param fileName  上传到FTP服务器后的文件名称
     * @param inputStream 输入文件流
     * @return
     */
    public static boolean uploadFile (String hostname, int port, String username, String password, String pathname,
                                      String fileName, InputStream inputStream)
    {
        boolean flag = false;
        FTPClient ftpClient = new FTPClient();
        ftpClient.setControlEncoding ("UTF-8");
        try
        {
            ftpClient.connect (hostname, port);
            ftpClient.login (username, password);
            int replyCode = ftpClient.getReplyCode ();
            if (!FTPReply.isPositiveCompletion (replyCode))
            {
                Log.e("tag",replyCode+"return");
                return flag;
            }

            ftpClient.setFileType (FTPClient.BINARY_FILE_TYPE);
            ftpClient.makeDirectory (pathname);
            ftpClient.changeWorkingDirectory (pathname);
            ftpClient.storeFile (fileName, inputStream);
            inputStream.close ();
            ftpClient.logout ();
            flag = true;
        }
        catch (Exception e)
        {
            Log.e("uploadError","upload ftp file error : "+e.toString());
        }
        finally
        {
            Log.e("tag","finally");
            if (ftpClient.isConnected ())
            {
                Log.e("tag","ftpClient.isConnected");
                try
                {
                    ftpClient.disconnect ();
                    Log.e("tag","ftpClient.disconnect");
                }
                catch (IOException e)
                {
                    Log.e("uploadError","close ftp connect  : "+e.toString());
                }
            }
        }
        return flag;
    }
1.2 下载文件
 
    /**
     * 下载文件
     * @param hostname FTP服务器地址
     * @param port FTP服务器端口号
     * @param username FTP登录帐号
     * @param password FTP登录密码
     * @param pathname FTP服务器文件目录
     * @param filename 文件名称
     * @param localpath 下载后的文件路径
     * @return
     */
    public static boolean downloadFile (String hostname, int port, String username, String password, String pathname,
        String filename, OutputStream out)
    {
        boolean flag = false;
        FTPClient ftpClient = new FTPClient ();
        try
        {
        	ftpClient.setConnectTimeout(1000*10);
            //连接FTP服务器
            ftpClient.connect (hostname, port);
            //登录FTP服务器
            ftpClient.login (username, password);
            ftpClient.setControlEncoding ("UTF-8"); // 设置字符编码
            //验证FTP服务器是否登录成功
            int replyCode = ftpClient.getReplyCode ();
            if (!FTPReply.isPositiveCompletion (replyCode))
            {
                LOGGER.info ("login ftp for download file fail.");
                return flag;
            }
            
            ftpClient.setKeepAlive(true);
            ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);
            ftpClient.setFileTransferMode(FTPClient.BINARY_FILE_TYPE);
            //切换FTP目录
            ftpClient.changeWorkingDirectory (pathname);
            FTPFile[] ftpFiles = ftpClient.listFiles ();
            for (FTPFile file : ftpFiles)
            {
                if (filename.equalsIgnoreCase (file.getName ()))
                {
                    ftpClient.retrieveFile (file.getName (), out);
                    out.flush ();
                    out.close ();
                    break;
                }
            }
            
            flag = true;
        }
        catch (Exception e)
        {
            LOGGER.error ("download file error.", e);
        }
        finally
        {
            if (ftpClient.isConnected ())
            {
                try
                {
                    ftpClient.logout ();
                }
                catch (IOException e)
                {
                    LOGGER.error ("close connection for download file error.", e);
                }
            }
            
            if (null != out)
            {
                try
                {
                    out.close ();
                }
                catch (IOException e)
                {
                    LOGGER.error ("close outputStream for download file error.", e);
                }
            }
        }
        return flag;
    }

1.3删除文件
/**
     * 删除文件
     * @param hostname FTP服务器地址
     * @param port FTP服务器端口号
     * @param username FTP登录帐号
     * @param password FTP登录密码
     * @param pathname FTP服务器保存目录
     * @param filename 要删除的文件名称
     * @return
     */
    public static boolean deleteFile (String hostname, int port, String username, String password, String pathname,
        String filename)
    {
        boolean flag = false;
        FTPClient ftpClient = new FTPClient ();
        try
        {
            //连接FTP服务器
            ftpClient.connect (hostname, port);
            //登录FTP服务器
            ftpClient.login (username, password);
            //验证FTP服务器是否登录成功
            int replyCode = ftpClient.getReplyCode ();
            if (!FTPReply.isPositiveCompletion (replyCode))
            {
                LOGGER.info ("login ftp delete ftp file fail.");
                return flag;
            }
            //切换FTP目录
            ftpClient.changeWorkingDirectory (pathname);
            ftpClient.dele (filename);
            ftpClient.logout ();
            flag = true;
        }
        catch (Exception e)
        {
            LOGGER.error ("delete ftp file error.", e);
        }
        finally
        {
            if (ftpClient.isConnected ())
            {
                try
                {
                    ftpClient.logout ();
                }
                catch (IOException e)
                {
                    LOGGER.error ("close connection for delete ftp file error.", e);
                }
            }
        }
        return flag;
    }
2.http post 上传文件
安卓采用 retrofit+okhttp 
声明接口:
 @Multipart
    @POST("File/Upload")
    Call<ResponseBody> upload(
            @Part("description") RequestBody description,
                              @Part MultipartBody.Part file);
上传部分的核心代码
 //构建body
            File file = new File(filePath);
            if(!file.exists()) {
               Toast.makeText(ac, "文件不存在", Toast.LENGTH_SHORT).show();
            }

            RequestBody requestFile =
                    RequestBody.create(MediaType.parse("multipart/form-data"), file);
            MultipartBody.Part body = MultipartBody.Part.createFormData("aFile", file.getName(), requestFile);

            String descriptionString = "This is a description";
            RequestBody description = RequestBody.create(MediaType.parse("multipart/form-data"), descriptionString);


            Call<ResponseBody> call = httpApi.upload(description,body);

服务端接收的代码
    @RequestMapping ("/Upload")
    public void upload (HttpServletRequest request, HttpServletResponse response)   { 
        try
        {
            /**
             * 测试数据
             */
            //String hostname = (String) redisCacheUtil.getDataFromRedis ("Collection_FTPHOST");//"192.168.80.11";
        	String hostname = "192.168.80.11";
            int port = Integer.parseInt ((String) redisCacheUtil.getDataFromRedis ("Collection_FTPPORT"));
            String username = (String) redisCacheUtil.getDataFromRedis ("Collection_FTPUSERNAME");
            String password = (String) redisCacheUtil.getDataFromRedis ("Collection_FTPPASSWORD");
            password = AesKeyUtils.decrypt (password.trim (), PropertiesReader.getUserPwdKey ());
          
            //String filename = (String) map.get("filename");//filename
            
            MultipartHttpServletRequest mkRequest = (MultipartHttpServletRequest )request;
            MultipartFile file = mkRequest.getFile("aFile");
            String filename = file.getOriginalFilename();
            String pathname ="";
            if(!filename.contains("TP") && !filename.contains("SN")) {
            	pathname = "/ftpdir/ftpdir/App";
            }else{
            	pathname = "/ftpdir/custDocument";
            }
           
            System.out.println(filename);
            InputStream in = file.getInputStream();
            boolean uploadFile = FtpUtils.uploadFile (hostname, port, username, password, pathname, filename, in);
            response.addHeader("result", uploadFile+"");
            
        }
        catch (IOException e)
        {
            LOGGER.error ("upload error");
        } 
    }
    
这里调取ftp的方法,存取到ftp文件服务器中;如果不乣ftp服务器,则直接处理
 InputStream in = file.getInputStream();
将输入流读取到文件中,即可.

服务端下载的代码
    @RequestMapping ("/Download")
    public void download (HttpServletRequest request, HttpServletResponse response)
    {
        
        try
        {
            //String hostname = (String) redisCacheUtil.getDataFromRedis ("Collection_FTPHOST");//"192.168.80.11";
            String hostname = "192.168.80.11";
            int port = Integer.parseInt ((String) redisCacheUtil.getDataFromRedis ("Collection_FTPPORT"));
            String username = (String) redisCacheUtil.getDataFromRedis ("Collection_FTPUSERNAME");
            String password = (String) redisCacheUtil.getDataFromRedis ("Collection_FTPPASSWORD");
            password = AesKeyUtils.decrypt (password.trim (), PropertiesReader.getUserPwdKey ());
            Map<String, Object> map = HttpToMap(request);
            String pathname = request.getParameter("pathname");
            String filename = request.getParameter("filename");
//          String pathname = (String) map.get("pathname");//"/ftpdir/ftpdir/App
//            String filename = (String) map.get("filename");//MOBILE_WORK.apk
            
            //导出文件名称
            response.reset ();
            response.setContentType ("application/audio/x-wav;charset=UTF-8");
            response.setHeader ("Content-disposition", "attachment;filename=" + filename);
            
            OutputStream out = response.getOutputStream ();
            FtpUtils.downloadFile (hostname, port, username, password, pathname, filename, out);
            
        }
        catch (IOException e)
        {
            LOGGER.error ("down error");
        }
        
    }



服务端删除文件的代码:
 @RequestMapping ("/Delete")
    @ResponseBody  
    public String  delete (HttpServletRequest request)   {  
        try
        {
            //String hostname = (String) redisCacheUtil.getDataFromRedis ("Collection_FTPHOST");//"192.168.80.11";
            String hostname ="192.168.80.11";
            int port = Integer.parseInt ((String) redisCacheUtil.getDataFromRedis ("Collection_FTPPORT"));
            String username = (String) redisCacheUtil.getDataFromRedis ("Collection_FTPUSERNAME");
            String password = (String) redisCacheUtil.getDataFromRedis ("Collection_FTPPASSWORD");
            password = AesKeyUtils.decrypt (password.trim (), PropertiesReader.getUserPwdKey ());
            //String pathname =(String) redisCacheUtil.getDataFromRedis ("APP_PATH"); // ;
            String pathname ="/ftpdir/custDocument";
            Map<String, Object> map = HttpToMap(request);
            String filename = (String) map.get("filename");
            
            boolean uploadFile = FtpUtils.deleteFile(hostname, port, username, password, pathname, filename);
            JSONObject jsonObject = new JSONObject();
            jsonObject.put("result",uploadFile+"");
            return jsonObject.toJSONString();
        }
        catch (IOException e)
        {
            LOGGER.error ("upload error");
            JSONObject jsonObject = new JSONObject();
            jsonObject.put("result",false+"");
            return jsonObject.toJSONString();
        }
       
    }


同理,下载和删除可直接绕过ftp,直接操作服务器固定文件夹下的文件
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值