Android上传图片到服务器并显示(后台用Java处理)

Android上传图片(Android Studio)
Fragment界面:
private String img_src;

/**
 * 从相册选取图片
 */
public void selectImg() {
    Intent intent = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
    intent.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, "image/*");
    startActivityForResult(intent, SELECT_PHOTO);
}

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    switch (requestCode) {      
        case SELECT_PHOTO:
            switch (resultCode) {
                case RESULT_OK:
                    Uri uri = data.getData();
                    img_src = uri.getPath();//这是本机的图片路径
                     
                      ContentResolver cr = getActivity().getContentResolver();
                    try {
                        Bitmap bitmap = BitmapFactory.decodeStream(cr.openInputStream(uri));
                        /* 将Bitmap设定到ImageView */
                        imageView.setImageBitmap(bitmap);

                        String[] proj = {MediaStore.Images.Media.DATA};
                        CursorLoader loader = new CursorLoader(getContext(), uri, proj, null, null, null);
                        Cursor cursor = loader.loadInBackground();
                        if (cursor != null) {
                            int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
                            cursor.moveToFirst();
                      
                            img_src = cursor.getString(column_index);//图片实际路径

                        }
                        cursor.close();

                    } catch (FileNotFoundException e) {
                        Log.e("Exception", e.getMessage(), e);
                    }

                    break;
            }
            break;

    }
}

public void uploadImage(String path) {

    new Thread(new Runnable() {
        @Override
        public void run() {

            String uploadurl = SharedPreferencesUtil.getServerUrls(getActivity()) + "mobileqrcode/uploadsignimg.html";
            try {
                File file = new File(img_src);
                result = UploadUtil.uploadImage(file, uploadurl);
            } catch (Exception e) {
                e.printStackTrace();
            }

        }
    }).start();

}
上传文件工具类:
public class UploadUtil {
    private static final String TAG = "uploadFile";
    private static final int TIME_OUT = 10 * 1000;//超时时间
    private static final String CHARSET = "utf-8";//设置编码

    /**
     * android上传文件到服务器
     *
     * @param file       需要上传的文件
     * @param RequestURL  请求的url
     * @return 返回响应的内容
     */
    public static String uploadImage(File file, String RequestURL) {
       String result = "error";
       String BOUNDARY = UUID.randomUUID().toString();//边界标识 随机生成
        String PREFIX = "--", LINE_END = "\r\n";
       String CONTENT_TYPE = "multipart/form-data";//内容类型
        try {
           URL url = new URL(RequestURL);
           HttpURLConnection conn = (HttpURLConnection) url.openConnection();
           conn.setReadTimeout(TIME_OUT);
           conn.setConnectTimeout(TIME_OUT);
           conn.setDoInput(true);//允许输入流
            conn.setDoOutput(true);//允许输出流
            conn.setUseCaches(false);//不允许使用缓存
            conn.setRequestMethod("POST");//请求方式
            conn.setRequestProperty("Charset", CHARSET);//设置编码
            conn.setRequestProperty("connection", "keep-alive");
           conn.setRequestProperty("Content-Type", CONTENT_TYPE + ";boundary=" + BOUNDARY);
           conn.connect();

            if (file != null) {
                //当文件不为空,把文件包装并且上传
                DataOutputStream dos = new DataOutputStream(conn.getOutputStream());
                /*StringBuilder sb = new StringBuilder();
                sb.append(PREFIX);
                sb.append(BOUNDARY);
                sb.append(LINE_END);
                *//*
                 * 这里重点注意:
                 * name里面的值为服务器端需要key,只有这个key才可以得到对应的文件
                 * filename是文件的名字,包含后缀名的。比如:abc.png 
                 *//*
                sb.append("Content-Disposition: form-data; name=\"inputName\"; filename=\"" + file.getName() + "\"" + LINE_END);
                //sb.append("Content-Type: application/octet-stream; charset=" + CHARSET + LINE_END);
                //sb.append("Content-Type: " + getMIMEType(file) + LINE_END);
                sb.append(LINE_END);
                dos.write(sb.toString().getBytes());*///此写法会导致无法上传
                  dos.writeBytes(PREFIX + BOUNDARY + LINE_END);
                dos.writeBytes("Content-Disposition: form-data; " + "name=\"inputName\";filename=\"" + file.getName() + "\"" + LINE_END);
                dos.writeBytes(LINE_END);

                FileInputStream is = new FileInputStream(file);
                byte[] bytes = new byte[1024];
                int len = -1;
                while ((len = is.read(bytes)) != -1) {
                    dos.write(bytes, 0, len);
                }
                is.close();
                dos.write(LINE_END.getBytes());

                byte[] end_data = (PREFIX + BOUNDARY + PREFIX + LINE_END).getBytes();
                dos.write(end_data);
                dos.flush();
                /*
                 * 获取响应码  200=成功
                 * 当响应成功,获取响应的流  
                 */
                int res = conn.getResponseCode();
                if (res == 200) {
                    InputStream input = conn.getInputStream();
                    StringBuilder sbs = new StringBuilder();
                    int ss;
                    while ((ss = input.read()) != -1) {
                        sbs.append((char) ss);
                    }
                    result = sbs.toString();
                    Log.i(TAG, "result------------------>>" + result);
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        return result;
    }

    private static String getMIMEType(File file) {
        String fileName = file.getName();
        if (fileName.endsWith("png") || fileName.endsWith("PNG")) {
            return "image/png";
        } else {
            return "image/jpg";
        }
    }
}
Java端接收图片(Eclipse)
@RequestMapping(value = "/uploadsignimg", method = RequestMethod.POST)
 public void uploadOrderSignImage(HttpServletRequest request, HttpSession session, HttpServletResponse response) {
  try {
   MultipartHttpServletRequest rq = (MultipartHttpServletRequest) request;
   Map<String, MultipartFile> file_list = rq.getFileMap();
  
   if (file_list != null && file_list.size() > 0) {
    if (file_list.containsKey("inputName")) {
     MultipartFile file = file_list.get("inputName");
     if (file != null) {
      // 保存订单签收图片
      String fileName = file.getOriginalFilename();
      String newFileName = "";
      String[] desp = fileName.split("\\.");
      if (desp != null && desp.length > 0) {
       String extendName = desp[desp.length - 1];
       newFileName = new Date().getTime() + "." + extendName;
       ServletContext servletContext = request.getSession().getServletContext();
       String uploadPath = servletContext.getRealPath("/") + "upload\\";
       File saveFile = new File(uploadPath, newFileName);
       file.transferTo(saveFile);
      }
      session.setAttribute("newfilename", newFileName);
     }
    }
   }
  } catch (Exception e) {
   e.printStackTrace();
  }
 }

  • 8
    点赞
  • 62
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
要在Android应用中将文件上服务器,可以按照以下步骤进行操作: 1. 首先,确保应用的AndroidManifest.xml文件中添加了以下权限: ```xml <uses-permission android:name="android.permission.INTERNET" /> ``` 这样才能进行网络通信。 2. 创建一个HTTP请求来上文件。可以使用Java的HttpURLConnection类或者第三方库如OkHttp或Volley来实现。以下是使用HttpURLConnection的示例代码: ```java URL url = new URL("http://example.com/upload"); // 服务器的上地址 HttpURLConnection connection = (HttpURLConnection) url.openConnection(); connection.setDoOutput(true); connection.setRequestMethod("POST"); // 设置请求头 connection.setRequestProperty("Content-Type", "multipart/form-data;boundary=" + boundary); // 创建请求体 DataOutputStream outputStream = new DataOutputStream(connection.getOutputStream()); outputStream.writeBytes("--" + boundary + "\r\n"); outputStream.writeBytes("Content-Disposition: form-data; name=\"file\";filename=\"" + fileName + "\"" + "\r\n"); outputStream.writeBytes("Content-Type: " + mimeType + "\r\n\r\n"); // 将文件数据写入请求体 File file = new File(filePath); FileInputStream fileInputStream = new FileInputStream(file); byte[] buffer = new byte[4096]; int bytesRead; while ((bytesRead = fileInputStream.read(buffer)) != -1) { outputStream.write(buffer, 0, bytesRead); } outputStream.writeBytes("\r\n"); outputStream.writeBytes("--" + boundary + "--\r\n"); // 关闭流 fileInputStream.close(); outputStream.flush(); outputStream.close(); // 获取服务器响应 int responseCode = connection.getResponseCode(); ``` 在上面的代码中,你需要修改以下变量: - `url`:服务器的上地址。 - `boundary`:用于分隔请求体中不同部分的边界字符串。 - `fileName`:要上的文件名。 - `mimeType`:文件的MIME类型。 - `filePath`:要上的文件的本地路径。 3. 处理服务器的响应。可以根据`responseCode`来判断上是否成功,以及根据需要处理服务器返回的数据。 请注意,上述代码仅为示例,实际实现中可能需要根据你的服务器端要求进行一些调整。另外,为了更好的用户体验,可以将文件上操作放在后台线程中执行,以避免阻塞主线程。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值