android上传文件至服务器(android端+服务器端)

引言:本来android文件上传的博客在网上挺多的,不过好些都只是有前台android端的上传,并没有后台服务器端的接收。而且自己写的时候也确实遇见了一些之前没注意到的地方,写出来也算是给自己提个醒。
我这里就不把全部的代码都贴出来了,就只贴一下核心代码就算了,如果有什么疑问或者不对的地方,欢迎指教。
我要做的是把我app的日志文件上传到指定服务器的功能。并没有写的太复杂,我参考鸿洋大神的博客的时候,看他对DataOutputStream写入了headinfo和endinfo,但是我没理解这样写的目的,所以也没加,如果有知道的可以告诉我呦。
废话不多说,直接上代码。
下面是android端上传文件代码:

    /**
     * 上传文件到服务器
     * @param context
     * @param uploadUrl     上传服务器地址
     * @param oldFilePath       本地文件路径
     */
    public static void uploadLogFile(Context context, String uploadUrl, String oldFilePath){
        try {
            URL url = new URL(path);  
            HttpURLConnection con = (HttpURLConnection)url.openConnection();

            // 允许Input、Output,不使用Cache
            con.setDoInput(true);
            con.setDoOutput(true);
            con.setUseCaches(false);

            con.setConnectTimeout(50000);
            con.setReadTimeout(50000);
            // 设置传送的method=POST
            con.setRequestMethod("POST");
            //在一次TCP连接中可以持续发送多份数据而不会断开连接
            con.setRequestProperty("Connection", "Keep-Alive");
            //设置编码
            con.setRequestProperty("Charset", "UTF-8");
            //text/plain能上传纯文本文件的编码格式
            con.setRequestProperty("Content-Type", "text/plain");

            // 设置DataOutputStream
            DataOutputStream ds = new DataOutputStream(con.getOutputStream());

            // 取得文件的FileInputStream
            FileInputStream fStream = new FileInputStream(oldFilePath);
            // 设置每次写入1024bytes
            int bufferSize = 1024;
            byte[] buffer = new byte[bufferSize];

            int length = -1;
            // 从文件读取数据至缓冲区
            while ((length = fStream.read(buffer)) != -1) {
                // 将资料写入DataOutputStream中
                ds.write(buffer, 0, length);
            }
            ds.flush();
            fStream.close();
            ds.close();
            if(con.getResponseCode() == 200){
                logger.info("文件上传成功!上传文件为:" + oldFilePath);
            }
        } catch (Exception e) {
            e.printStackTrace();
            logger.info("文件上传失败!上传文件为:" + oldFilePath);
            logger.error("报错信息toString:" + e.toString());
        }
    }

服务器这里我是用我自己本地的tomcat做的测试服务器,这个你们可以通过配置文件或者自己指定服务器。
下面是服务器端接收文件代码:

@RequestMapping(value = "/uploadFile")
    public void uploadFile(HttpServletRequest request, HttpServletResponse response)  
            throws IOException  
    {  
        InputStream is = request.getInputStream();
        DataInputStream dis = new DataInputStream(is);

        String result = "";
        try {
            result = saveFile(dis);
        } catch (Exception e) {
            e.printStackTrace();
            result = "uploaderror";
        }

        request.getSession().invalidate();
        response.setContentType("text/html;charset=UTF-8");
        ObjectOutputStream dos = new ObjectOutputStream(
                    response.getOutputStream());
        dos.writeObject(result);
        dos.flush();
        dos.close();
        dis.close();
        is.close();
    }

/**
     * 保存文件
     * @param dis
     * @return
     */
    private String saveFile(DataInputStream dis) {
        String fileurl = "F:/apache-tomcat-7.0.70/webapps/upload/2017-06-12.log";
        File file = new File(fileurl);
        if (!file.exists()) {
            try {
                file.createNewFile();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        FileOutputStream fps = null;
        try {
            fps = new FileOutputStream(file);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
        int bufferSize = 1024;
        byte[] buffer = new byte[bufferSize];
        int length = -1;

        try {
            while ((length = dis.read(buffer)) != -1) {
                fps.write(buffer, 0, length);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        try {
            fps.flush();
            fps.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return "success";
    }

个人情况总结:我个人出现的情况是,上传的文件没有数据,就是DataOutputStream在服务器端接收的时候,是没内容的,可是我在android端调试的时候,明明是能看到数据,后来找了1天时间,找到了原因。因为我上传的是日志文件,属于纯文本文件,可是最开始我设置http中Content-Type格式的时候,我设置的是multipart/form-data格式,到后面改成text/plain格式才能正常上传(之前的我是在网上直接扒下来的,坑~)。所以这里的格式要根据你实际的文件类型来设置。
这里关于Content-Type格式的问题,我参考了以下博客,更详细的讲解可过去看看:
http://blog.csdn.net/blueheart20/article/details/45174399

常见的媒体格式类型如下:

    text/html : HTML格式
    text/plain :纯文本格式     
    text/xml :  XML格式
    image/gif :gif图片格式   
    image/jpeg :jpg图片格式
    image/png:png图片格式

以application开头的媒体格式类型:

   application/xhtml+xml :XHTML格式
   application/xml     : XML数据格式
   application/atom+xml  :Atom XML聚合格式   
   application/json    : JSON数据格式
   application/pdf       :pdf格式 
   application/msword  : Word文档格式
   application/octet-stream : 二进制流数据(如常见的文件下载)
   application/x-www-form-urlencoded : <form encType=””>中默认的encType,form表单数据被编码为key/value格式发送到服务器(表单默认的提交数据的格式)

另外一种常见的媒体格式是上传文件之时使用的:

    multipart/form-data : 需要在表单中进行文件上传时,就需要使用该格式

以上就是我们在日常的开发中,经常会用到的若干content-type的内容格式。

  • 30
    点赞
  • 173
    收藏
    觉得还不错? 一键收藏
  • 27
    评论
要在Android应用程序中上传文件服务器,可以按照以下步骤进行操作: 1. 首先,确保你有一个可以接受文件上传服务器。你可以使用常见的后技术(如Node.js、PHP等)来构建一个简单的服务器端。 2. 在Android应用中,需要获取要上传的文件的路径。你可以使用`Intent`来让用户选择文件,并获取文件的URI。 3. 使用网络请求库(如OkHttp、Retrofit等)发送HTTP POST请求到服务器。在请求中,将文件作为请求体的一部分进行上传。下面是一个使用OkHttp库的示例代码: ```java OkHttpClient client = new OkHttpClient(); File file = new File(filePath); // 文件路径 RequestBody requestBody = new MultipartBody.Builder() .setType(MultipartBody.FORM) .addFormDataPart("file", file.getName(), RequestBody.create(MediaType.parse("application/octet-stream"), file)) .build(); Request request = new Request.Builder() .url("http://your-server-url.com/upload") .post(requestBody) .build(); try { Response response = client.newCall(request).execute(); if (response.isSuccessful()) { // 文件上传成功 } else { // 文件上传失败 } } catch (IOException e) { e.printStackTrace(); } ``` 在上述代码中,将文件添加到`MultipartBody`中,并将其作为请求的一部分。确保将`"file"`替换为服务器端期望的文件参数名称。 4. 在服务器端,处理文件上传请求并保存文件。具体的实现取决于你使用的后技术。根据后框架的文档和示例代码进行操作。 这是一个基本的文件上传流程。你可以根据自己的需求进行修改和扩展。希望对你有帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 27
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值