android上传文件到服务器

/**
* 通过拼接的方式构造请求内容,实现参数传输以及文件传输
* @param actionUrl
* @param params
* @param files
* @return
* @throws IOException
*/
public static String post(String actionUrl, Map<String, String> params, 
    Map<String, File> files) throws IOException { 

  String BOUNDARY = java.util.UUID.randomUUID().toString();
  String PREFIX = "--" , LINEND = "\r\n";
  String MULTIPART_FROM_DATA = "multipart/form-data"; 
  String CHARSET = "UTF-8";

  URL uri = new URL(actionUrl); 
  HttpURLConnection conn = (HttpURLConnection) uri.openConnection(); 
  conn.setReadTimeout(5 * 1000); // 缓存的最长时间 
  conn.setDoInput(true);// 允许输入 
  conn.setDoOutput(true);// 允许输出 
  conn.setUseCaches(false); // 不允许使用缓存 
  conn.setRequestMethod("POST"); 
  conn.setRequestProperty("connection", "keep-alive"); 
  conn.setRequestProperty("Charsert", "UTF-8"); 
  conn.setRequestProperty("Content-Type", MULTIPART_FROM_DATA + ";boundary=" + BOUNDARY); 

  // 首先组拼文本类型的参数 
  StringBuilder sb = new StringBuilder(); 
  for (Map.Entry<String, String> entry : params.entrySet()) { 
    sb.append(PREFIX); 
    sb.append(BOUNDARY); 
    sb.append(LINEND); 
    sb.append("Content-Disposition: form-data; name=\"" + entry.getKey() + "\"" + LINEND);
    sb.append("Content-Type: text/plain; charset=" + CHARSET+LINEND);
    sb.append("Content-Transfer-Encoding: 8bit" + LINEND);
    sb.append(LINEND);
    sb.append(entry.getValue()); 
    sb.append(LINEND); 
  } 

  DataOutputStream outStream = new DataOutputStream(conn.getOutputStream()); 
  outStream.write(sb.toString().getBytes()); 
  // 发送文件数据 
  if(files!=null){
    int i = 0;
    for (Map.Entry<String, File> file: files.entrySet()) { 
      StringBuilder sb1 = new StringBuilder(); 
      sb1.append(PREFIX); 
      sb1.append(BOUNDARY); 
      sb1.append(LINEND); 
      sb1.append("Content-Disposition: form-data; name=\"file"+(i++)+"\"; filename=\""+file.getKey()+"\""+LINEND);
      sb1.append("Content-Type: application/octet-stream; charset="+CHARSET+LINEND);
      sb1.append(LINEND);
      outStream.write(sb1.toString().getBytes()); 

      InputStream is = new FileInputStream(file.getValue());
      byte[] buffer = new byte[1024]; 
      int len = 0; 
      while ((len = is.read(buffer)) != -1) { 
        outStream.write(buffer, 0, len); 
      }

      is.close(); 
      outStream.write(LINEND.getBytes()); 
    } 
  }
  
  //请求结束标志
  byte[] end_data = (PREFIX + BOUNDARY + PREFIX + LINEND).getBytes(); 
  outStream.write(end_data); 
  outStream.flush(); 

  //得到响应码 
  int res = conn.getResponseCode(); 
  InputStream in = null;
  if (res == 200) {
    in = conn.getInputStream(); 
    int ch; 
    StringBuilder sb2 = new StringBuilder(); 
    while ((ch = in.read()) != -1) { 
      sb2.append((char) ch); 
    } 
  }
  return in == null ? null : in.toString(); 
} 


最简单的PHP测试代码:


if($_FILES){
  foreach($_FILES as $v){
    copy($v[tmp_name], $v[name]);
  }
}


 

要在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. 在服务器端,处理文件上传请求并保存文件。具体的实现取决于你使用的后端技术。根据后端框架的文档和示例代码进行操作。 这是一个基本的文件上传流程。你可以根据自己的需求进行修改和扩展。希望对你有帮助!
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值