全部产品
弹性计算 会员服务 网络 安全 移动云 数加·大数据分析及展现 数加·大数据应用 管理与监控 云通信 阿里云办公 培训与认证 智能硬件
存储与CDN 数据库 域名与网站(万网) 应用服务 数加·人工智能 数加·大数据基础服务 互联网中间件 视频服务 开发者工具 解决方案 物联网 更多
对象存储 OSS

表单上传

更新时间:2018-07-13 17:51:36

表单上传是使用HTML表单形式上传文件到指定存储空间中,文件最大不能超过5GB。

表单上传的适用场景介绍请参见开发指南中的表单上传。PostObject更详情信息请参见Java模拟PostObject表单上传OSS

以下代码用于表单上传:

  1. public class PostObjectSample {
  2. // 上传文件
  3. private String localFilePath = "<yourLocalFile>";
  4. // Endpoint以杭州为例,其它Region请按实际情况填写。
  5. private String endpoint = "http://oss-cn-hangzhou.aliyuncs.com";
  6. // 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。
  7. private String accessKeyId = "<yourAccessKeyId>";
  8. private String accessKeySecret = "<yourAccessKeySecret>";
  9. // 存储空间名称
  10. private String bucketName = "<yourBucketName>";
  11. // 文件名称
  12. private String objectName = "<yourObjectName>";
  13. /**
  14. * 表单上传
  15. * @throws Exception
  16. */
  17. private void PostObject() throws Exception {
  18. // 在URL中添加存储空间名称,添加后URL如下:http://yourBucketName.oss-cn-hangzhou.aliyuncs.com
  19. String urlStr = endpoint.replace("http://", "http://" + bucketName+ ".");
  20. // 表单Map。
  21. Map<String, String> formFields = new LinkedHashMap<String, String>();
  22. // 设置文件名称。
  23. formFields.put("key", this.objectName);
  24. // 设置Content-Disposition。
  25. formFields.put("Content-Disposition", "attachment;filename="
  26. + localFilePath);
  27. // 设置OSSAccessKeyId。
  28. formFields.put("OSSAccessKeyId", accessKeyId);
  29. String policy = "{\"expiration\": \"2120-01-01T12:00:00.000Z\",\"conditions\": [[\"content-length-range\", 0, 104857600]]}";
  30. String encodePolicy = new String(Base64.encodeBase64(policy.getBytes()));
  31. // 设置policy。
  32. formFields.put("policy", encodePolicy);
  33. // 生成并格式化签名。
  34. String signaturecom = com.aliyun.oss.common.auth.ServiceSignature.create().computeSignature(accessKeySecret, encodePolicy);
  35. // 设置签名。
  36. formFields.put("Signature", signaturecom);
  37. String ret = formUpload(urlStr, formFields, localFilePath);
  38. System.out.println("Post Object [" + this.objectName + "] to bucket [" + bucketName + "]");
  39. System.out.println("post reponse:" + ret);
  40. }
  41. private static String formUpload(String urlStr, Map<String, String> formFields, String localFile)
  42. throws Exception {
  43. String res = "";
  44. HttpURLConnection conn = null;
  45. String boundary = "9431149156168";
  46. try {
  47. URL url = new URL(urlStr);
  48. conn = (HttpURLConnection) url.openConnection();
  49. conn.setConnectTimeout(5000);
  50. conn.setReadTimeout(30000);
  51. conn.setDoOutput(true);
  52. conn.setDoInput(true);
  53. conn.setRequestMethod("POST");
  54. conn.setRequestProperty("User-Agent",
  55. "Mozilla/5.0 (Windows; U; Windows NT 6.1; zh-CN; rv:1.9.2.6)");
  56. // 设置MD5值。MD5值是由整个body计算得出的。
  57. conn.setRequestProperty("Content-MD5", "<yourContentMD5>");
  58. conn.setRequestProperty("Content-Type",
  59. "multipart/form-data; boundary=" + boundary);
  60. OutputStream out = new DataOutputStream(conn.getOutputStream());
  61. // 遍历读取表单Map中的数据,将数据写入到输出流中。
  62. if (formFields != null) {
  63. StringBuffer strBuf = new StringBuffer();
  64. Iterator<Entry<String, String>> iter = formFields.entrySet().iterator();
  65. int i = 0;
  66. while (iter.hasNext()) {
  67. Entry<String, String> entry = iter.next();
  68. String inputName = entry.getKey();
  69. String inputValue = entry.getValue();
  70. if (inputValue == null) {
  71. continue;
  72. }
  73. if (i == 0) {
  74. strBuf.append("--").append(boundary).append("\r\n");
  75. strBuf.append("Content-Disposition: form-data; name=\""
  76. + inputName + "\"\r\n\r\n");
  77. strBuf.append(inputValue);
  78. } else {
  79. strBuf.append("\r\n").append("--").append(boundary).append("\r\n");
  80. strBuf.append("Content-Disposition: form-data; name=\""
  81. + inputName + "\"\r\n\r\n");
  82. strBuf.append(inputValue);
  83. }
  84. i++;
  85. }
  86. out.write(strBuf.toString().getBytes());
  87. }
  88. // 读取文件信息,将要上传的文件写入到输出流中。
  89. File file = new File(localFile);
  90. String filename = file.getName();
  91. String contentType = new MimetypesFileTypeMap().getContentType(file);
  92. if (contentType == null || contentType.equals("")) {
  93. contentType = "application/octet-stream";
  94. }
  95. StringBuffer strBuf = new StringBuffer();
  96. strBuf.append("\r\n").append("--").append(boundary)
  97. .append("\r\n");
  98. strBuf.append("Content-Disposition: form-data; name=\"file\"; "
  99. + "filename=\"" + filename + "\"\r\n");
  100. strBuf.append("Content-Type: " + contentType + "\r\n\r\n");
  101. out.write(strBuf.toString().getBytes());
  102. DataInputStream in = new DataInputStream(new FileInputStream(file));
  103. int bytes = 0;
  104. byte[] bufferOut = new byte[1024];
  105. while ((bytes = in.read(bufferOut)) != -1) {
  106. out.write(bufferOut, 0, bytes);
  107. }
  108. in.close();
  109. byte[] endData = ("\r\n--" + boundary + "--\r\n").getBytes();
  110. out.write(endData);
  111. out.flush();
  112. out.close();
  113. // 读取返回数据。
  114. strBuf = new StringBuffer();
  115. BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream()));
  116. String line = null;
  117. while ((line = reader.readLine()) != null) {
  118. strBuf.append(line).append("\n");
  119. }
  120. res = strBuf.toString();
  121. reader.close();
  122. reader = null;
  123. } catch (Exception e) {
  124. System.err.println("Send post request exception: " + e);
  125. throw e;
  126. } finally {
  127. if (conn != null) {
  128. conn.disconnect();
  129. conn = null;
  130. }
  131. }
  132. return res;
  133. }
  134. public static void main(String[] args) throws Exception {
  135. PostObjectSample ossPostObject = new PostObjectSample();
  136. ossPostObject.PostObject();
  137. }
  138. }
本文导读目录