Skip to content

Commit 6ae5e8b

Browse files
Private download link generator
1 parent d4bedb3 commit 6ae5e8b

3 files changed

Lines changed: 46 additions & 3 deletions

File tree

src/com/cloudinary/Cloudinary.java

Lines changed: 33 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import java.io.UnsupportedEncodingException;
44
import java.net.URI;
5+
import java.net.URISyntaxException;
56
import java.net.URLDecoder;
67
import java.security.MessageDigest;
78
import java.security.NoSuchAlgorithmException;
@@ -11,12 +12,15 @@
1112
import java.util.Collection;
1213
import java.util.Collections;
1314
import java.util.HashMap;
15+
import java.util.Iterator;
1416
import java.util.List;
1517
import java.util.Map;
1618
import java.util.TreeMap;
1719

1820
import org.apache.commons.codec.binary.Hex;
1921
import org.apache.commons.lang.StringUtils;
22+
import org.apache.http.client.utils.URIBuilder;
23+
import org.apache.http.client.utils.URLEncodedUtils;
2024

2125
@SuppressWarnings({"rawtypes", "unchecked"})
2226
public class Cloudinary {
@@ -98,7 +102,35 @@ public String apiSignRequest(Map<String, Object> paramsToSign, String apiSecret)
98102
byte[] digest = md.digest((to_sign + apiSecret).getBytes());
99103
return Hex.encodeHexString(digest);
100104
}
101-
105+
106+
public String privateDownload(String publicId, String format, Map<String, Object> options) throws URISyntaxException {
107+
String apiKey = Cloudinary.asString(options.get("api_key"), this.getStringConfig("api_key"));
108+
if (apiKey == null)
109+
throw new IllegalArgumentException("Must supply api_key");
110+
String apiSecret = Cloudinary.asString(options.get("api_secret"), this.getStringConfig("api_secret"));
111+
if (apiSecret == null)
112+
throw new IllegalArgumentException("Must supply api_secret");
113+
Map<String, Object> params = new HashMap<String, Object>();
114+
params.put("public_id", publicId);
115+
params.put("format", format);
116+
params.put("attachment", options.get("attachment"));
117+
params.put("type", options.get("type"));
118+
for (Iterator iterator = params.values().iterator(); iterator.hasNext();) {
119+
Object value = iterator.next();
120+
if (value == null || "".equals(value)) {
121+
iterator.remove();
122+
}
123+
}
124+
params.put("timestamp", new Long(System.currentTimeMillis() / 1000L).toString());
125+
params.put("signature", this.apiSignRequest(params, apiSecret));
126+
params.put("api_key", apiKey);
127+
URIBuilder builder = new URIBuilder(cloudinaryApiUrl("download", options));
128+
for (Map.Entry<String, Object> param : params.entrySet()) {
129+
builder.addParameter(param.getKey(), param.getValue().toString());
130+
}
131+
return builder.toString();
132+
}
133+
102134
protected void initFromUrl(String cloudinaryUrl) {
103135
URI cloudinaryUri = URI.create(cloudinaryUrl);
104136
setConfig("cloud_name", cloudinaryUri.getHost());

src/com/cloudinary/Url.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,10 @@ public Url type(String type) {
3737
}
3838

3939
public Url resourcType(String resourceType) {
40+
return resourceType(resourceType);
41+
}
42+
43+
public Url resourceType(String resourceType) {
4044
this.resourceType = resourceType;
4145
return this;
4246
}
@@ -150,7 +154,7 @@ public String generate(String source) {
150154
return StringUtils.join(new String[] { prefix, resourceType, type, transformationStr, version, source }, "/").replaceAll(
151155
"([^:])\\/+", "$1/");
152156
}
153-
157+
154158
public String imageTag(String source) {
155159
return imageTag(source, Cloudinary.emptyMap());
156160
}

tests/com/cloudinary/test/CloudinaryTest.java

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,10 @@
33
import static org.junit.Assert.assertEquals;
44
import static org.junit.Assert.assertNull;
55

6+
import java.net.URISyntaxException;
7+
import java.util.HashMap;
8+
import java.util.Map;
9+
610
import org.junit.Before;
711
import org.junit.Test;
812

@@ -332,6 +336,7 @@ public void testImageTag() {
332336
assertEquals("<img src='http://res.cloudinary.com/test123/image/upload/c_crop,h_101,w_100/test' alt='my image' height='101' width='100'/>", result);
333337
}
334338

339+
@Test
335340
public void testFolders() {
336341
// should add version if public_id contains /
337342
String result = cloudinary.url().generate("folder/test");
@@ -340,15 +345,17 @@ public void testFolders() {
340345
assertEquals("http://res.cloudinary.com/test123/image/upload/v123/folder/test", result);
341346
}
342347

348+
@Test
343349
public void testFoldersWithVersion() {
344350
// should not add version if public_id contains version already
345351
String result = cloudinary.url().generate("v1234/test");
346352
assertEquals("http://res.cloudinary.com/test123/image/upload/v1234/test", result);
347353
}
348354

355+
@Test
349356
public void testShorten() {
350357
// should allow to shorted image/upload urls
351358
String result = cloudinary.url().shorten(true).generate("test");
352359
assertEquals("http://res.cloudinary.com/test123/iu/test", result);
353-
}
360+
}
354361
}

0 commit comments

Comments
 (0)