文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Java 中的附件上传功能怎么利用HttpURLConnection实现

2023-05-31 03:22

关注

本篇文章给大家分享的是有关Java 中的附件上传功能怎么利用HttpURLConnection实现,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。

Java 中HttpURLConnection附件上传的实例详解

示例代码:

 public class HttpPostUtil {    private final static char[] MULTIPART_CHARS = "-_1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"       .toCharArray();    private URL url;   private HttpURLConnection conn;   private String boundary = null;   private Map<String, String> textParams = new HashMap<String, String>();   private Map<String, File> fileparams = new HashMap<String, File>();    public HttpPostUtil(String url) throws Exception {     this.url = new URL(url);   }    // 重新设置要请求的服务器地址,即上传文件的地址。   public void setUrl(String url) throws Exception {     this.url = new URL(url);   }    // 增加一个普通字符串数据到form表单数据中   public void addTextParameter(String name, String value) {     textParams.put(name, value);   }    // 增加一个文件到form表单数据中   public void addFileParameter(String name, File value) {     fileparams.put(name, value);   }    // 清空所有已添加的form表单数据   public void clearAllParameters() {     textParams.clear();     fileparams.clear();   }       public byte[] send() throws Exception {     initConnection();     try {       conn.connect();     } catch (SocketTimeoutException e) {       throw new Exception(e);     }      OutputStream connOutStream = new DataOutputStream(         conn.getOutputStream());      writeFileParams(connOutStream);     writeStringParams(connOutStream);     writesEnd(connOutStream);      InputStream responseInStream = conn.getInputStream();     ByteArrayOutputStream responseOutStream = new ByteArrayOutputStream();     int len;     byte[] bufferByte = new byte[1024];     while ((len = responseInStream.read(bufferByte)) != -1) {       responseOutStream.write(bufferByte, 0, len);     }     responseInStream.close();     connOutStream.close();      conn.disconnect();     byte[] resultByte = responseOutStream.toByteArray();     responseOutStream.close();     return resultByte;   }    // 文件上传的connection的一些必须设置   private void initConnection() throws Exception {     StringBuffer buf = new StringBuffer("----");     Random rand = new Random();     for (int i = 0; i < 15; i++) {       buf.append(MULTIPART_CHARS[rand.nextInt(MULTIPART_CHARS.length)]);     }     this.boundary = buf.toString();      conn = (HttpURLConnection) this.url.openConnection();     conn.setDoOutput(true);     conn.setUseCaches(false);     conn.setConnectTimeout(3 * 60 * 1000); // 连接超时为10秒     conn.setRequestMethod("POST");     conn.setRequestProperty("Content-Type",         "multipart/form-data; boundary=" + boundary);   }    // 普通字符串数据   private void writeStringParams(OutputStream out) throws Exception {     Set<String> keySet = textParams.keySet();     for (Iterator<String> it = keySet.iterator(); it.hasNext();) {       String name = it.next();       String value = textParams.get(name);        out.write(("--" + boundary + "\r\n").getBytes());       out.write(("Content-Disposition: form-data; name=\"" + name + "\"\r\n")           .getBytes());       out.write(("\r\n").getBytes());       out.write((encode(value) + "\r\n").getBytes());     }   }    // 文件数据   private void writeFileParams(OutputStream out) throws Exception {     Set<String> keySet = fileparams.keySet();     for (Iterator<String> it = keySet.iterator(); it.hasNext();) {       String name = it.next();       File value = fileparams.get(name);        out.write(("--" + boundary + "\r\n").getBytes());       out.write(("Content-Disposition: form-data; name=\"" + name           + "\"; filename=\"" + encode(value.getName()) + "\"\r\n")           .getBytes());       out.write(("Content-Type: " + getContentType(value) + "\r\n")           .getBytes());       out.write(("Content-Transfer-Encoding: " + "binary" + "\r\n")           .getBytes());        out.write(("\r\n").getBytes());        FileInputStream inStream = new FileInputStream(value);       int bytes = 0;       byte[] bufferByte = new byte[1024];       while ((bytes = inStream.read(bufferByte)) != -1) {         out.write(bufferByte, 0, bytes);       }       inStream.close();        out.write(("\r\n").getBytes());     }   }    // 添加结尾数据   private void writesEnd(OutputStream out) throws Exception {     out.write(("--" + boundary + "--" + "\r\n").getBytes());     out.write(("\r\n").getBytes());   }    // 获取文件的上传类型,图片格式为image/png,image/jpg等。非图片为application/octet-stream   private String getContentType(File f) throws Exception {     String fileName = f.getName();     if (fileName.endsWith(".jpg")) {       return "image/jpeg";     } else if (fileName.endsWith(".png")) {       return "image/png";     }     return "application/octet-stream";   }    // 对包含中文的字符串进行转码,此为UTF-8。服务器那边要进行一次解码   private String encode(String value) throws Exception {     return URLEncoder.encode(value, "UTF-8");   }  } 

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 资料下载
  • 历年真题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯