表单上传是使用HTML表单形式上传文件(Object)到指定存储空间(Bucket)中,文件最大不能超过5 GB。
以下代码用于表单上传:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 | public class PostObjectSample { // 上传文件 private String localFilePath = "<yourLocalFile>" ; // Endpoint以杭州为例,其它Region请按实际情况填写。 // 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录RAM控制台创建RAM账号。 private String accessKeyId = "<yourAccessKeyId>" ; private String accessKeySecret = "<yourAccessKeySecret>" ; // 设置存储空间名称。 private String bucketName = "<yourBucketName>" ; // 设置文件名称。 private String objectName = "<yourObjectName>" ; /** * 表单上传。 * @throws Exception */ private void PostObject() throws Exception { // 在URL中添加存储空间名称,添加后URL如下:http://yourBucketName.oss-cn-hangzhou.aliyuncs.com。 // 设置表单Map。 Map<String, String> formFields = new LinkedHashMap<String, String>(); // 设置文件名称。 formFields.put( "key" , this .objectName); // 设置Content-Disposition。 formFields.put( "Content-Disposition" , "attachment;filename=" + localFilePath); // 设置回调参数。 Callback callback = new Callback(); // 设置回调服务器地址,如http://oss-demo.aliyuncs.com:23450或http://127.0.0.1:9090。 callback.setCallbackUrl( "<yourCallbackServerUrl>" ); // 设置回调请求消息头中Host的值,如oss-cn-hangzhou.aliyuncs.com。 callback.setCallbackHost( "<yourCallbackServerHost>" ); // 设置发起回调时请求body的值。 callback.setCallbackBody( "{\\\"mimeType\\\":${mimeType},\\\"size\\\":${size}}" ); // 设置发起回调请求的Content-Type。 callback.setCalbackBodyType(CalbackBodyType.JSON); // 设置发起回调请求的自定义参数,由Key和Value组成,Key必须以x:开始,且必须小写。 callback.addCallbackVar( "x:var1" , "value1" ); callback.addCallbackVar( "x:var2" , "value2" ); // 在表单Map中设置回调参数。 setCallBack(formFields, callback); // 设置OSSAccessKeyId。 formFields.put( "OSSAccessKeyId" , accessKeyId); String policy = "{\"expiration\": \"2120-01-01T12:00:00.000Z\",\"conditions\": [[\"content-length-range\", 0, 104857600]]}" ; String encodePolicy = new String(Base64.encodeBase64(policy.getBytes())); // 设置policy。 formFields.put( "policy" , encodePolicy); // 生成签名。 String signaturecom = com.aliyun.oss.common.auth.ServiceSignature.create().computeSignature(accessKeySecret, encodePolicy); // 设置签名。 formFields.put( "Signature" , signaturecom); String ret = formUpload(urlStr, formFields, localFilePath); System.out.println( "Post Object [" + this .objectName + "] to bucket [" + bucketName + "]" ); System.out.println( "post reponse:" + ret); } private static String formUpload(String urlStr, Map<String, String> formFields, String localFile) throws Exception { String res = "" ; HttpURLConnection conn = null ; String boundary = "9431149156168" ; try { URL url = new URL(urlStr); conn = (HttpURLConnection) url.openConnection(); conn.setConnectTimeout( 5000 ); conn.setReadTimeout( 30000 ); conn.setDoOutput( true ); conn.setDoInput( true ); conn.setRequestMethod( "POST" ); conn.setRequestProperty( "User-Agent" , "Mozilla/5.0 (Windows; U; Windows NT 6.1; zh-CN; rv:1.9.2.6)" ); // 设置MD5值。MD5值由整个body计算得出。 conn.setRequestProperty( "Content-MD5" , "<yourContentMD5>" ); conn.setRequestProperty( "Content-Type" , "multipart/form-data; boundary=" + boundary); OutputStream out = new DataOutputStream(conn.getOutputStream()); // 遍历读取表单Map中的数据,将数据写入到输出流中。 if (formFields != null ) { StringBuffer strBuf = new StringBuffer(); Iterator<Entry<String, String>> iter = formFields.entrySet().iterator(); int i = 0 ; while (iter.hasNext()) { Entry<String, String> entry = iter.next(); String inputName = entry.getKey(); String inputValue = entry.getValue(); if (inputValue == null ) { continue ; } if (i == 0 ) { strBuf.append( "--" ).append(boundary).append( "\r\n" ); strBuf.append( "Content-Disposition: form-data; name=\"" + inputName + "\"\r\n\r\n" ); strBuf.append(inputValue); } else { strBuf.append( "\r\n" ).append( "--" ).append(boundary).append( "\r\n" ); strBuf.append( "Content-Disposition: form-data; name=\"" + inputName + "\"\r\n\r\n" ); strBuf.append(inputValue); } i++; } out.write(strBuf.toString().getBytes()); } // 读取文件信息,将要上传的文件写入到输出流中。 File file = new File(localFile); String filename = file.getName(); String contentType = new MimetypesFileTypeMap().getContentType(file); if (contentType == null || contentType.equals( "" )) { contentType = "application/octet-stream" ; } StringBuffer strBuf = new StringBuffer(); strBuf.append( "\r\n" ).append( "--" ).append(boundary) .append( "\r\n" ); strBuf.append( "Content-Disposition: form-data; name=\"file\"; " + "filename=\"" + filename + "\"\r\n" ); strBuf.append( "Content-Type: " + contentType + "\r\n\r\n" ); out.write(strBuf.toString().getBytes()); DataInputStream in = new DataInputStream( new FileInputStream(file)); int bytes = 0 ; byte [] bufferOut = new byte [ 1024 ]; while ((bytes = in.read(bufferOut)) != - 1 ) { out.write(bufferOut, 0 , bytes); } in.close(); byte [] endData = ( "\r\n--" + boundary + "--\r\n" ).getBytes(); out.write(endData); out.flush(); out.close(); // 读取返回数据。 strBuf = new StringBuffer(); BufferedReader reader = new BufferedReader( new InputStreamReader(conn.getInputStream())); String line = null ; while ((line = reader.readLine()) != null ) { strBuf.append(line).append( "\n" ); } res = strBuf.toString(); reader.close(); reader = null ; } catch (Exception e) { System.err.println( "Send post request exception: " + e); throw e; } finally { if (conn != null ) { conn.disconnect(); conn = null ; } } return res; } private static void setCallBack(Map<String, String> formFields, Callback callback) { if (callback != null ) { String jsonCb = OSSUtils.jsonizeCallback(callback); String base64Cb = BinaryUtil.toBase64String(jsonCb.getBytes()); formFields.put( "callback" , base64Cb); if (callback.hasCallbackVar()) { Map<String, String> varMap = callback.getCallbackVar(); for (Entry<String, String> entry : varMap.entrySet()) { formFields.put(entry.getKey(), entry.getValue()); } } } } public static void main(String[] args) throws Exception { PostObjectSample ossPostObject = new PostObjectSample(); ossPostObject.PostObject(); } } |
有关表单上传的适用场景及详细介绍,请参见表单上传和PostObject。有关回调的详细介绍,请参见Callback。