我正在编写一个脚本,将文件上传到需要多部分请求的cgi脚本,例如HTML页面上的表单。 boundary
是一个唯一标记,用于注释请求正文中的文件内容。这是一个示例正文:
--BOUNDARY
Content-Disposition: form-data; name="paramname"; filename="foo.txt"
Content-Type: text/plain
... file contents here ...
--BOUNDARY--
由于显而易见的原因,boundary
不能出现在文件内容中。
为了创造一个独特的边界,我该怎么做?我应该生成一个随机字符串,检查它是否在文件内容中,如果是,则生成一个新的,冲洗并重复,直到我有一个唯一的字符串?或者“相当随机的令牌”(比如时间戳,进程ID等的组合)是否足够?
答案 0 :(得分:50)
如果您使用像GUID一样随机的东西,则不需要寻找有效负载以检查边界的别名。类似的东西: -
---- = NextPart_3676416B-9AD6-440C-B3C8-FC66DDC7DB45
部首:....
净荷
---- = NextPart_3676416B-9AD6-440C-B3C8-FC66DDC7DB45 -
答案 1 :(得分:12)
对于Java家伙:
protected String generateBoundary() {
StringBuilder buffer = new StringBuilder();
Random rand = new Random();
int count = rand.nextInt(11) + 30; // a random size from 30 to 40
for (int i = 0; i < count; i++) {
buffer.append(MULTIPART_CHARS[rand.nextInt(MULTIPART_CHARS.length)]);
}
return buffer.toString();
}
private final static char[] MULTIPART_CHARS =
"-_1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
.toCharArray();
答案 2 :(得分:0)
如果你感觉偏执,你可以生成一个随机边界并在要发送的字符串中搜索它,在find,repeat上附加随机字符(或重新创建新字符)。但是我的经验是任何10字左右的任意非字典字符串几乎不可能发生,所以选择像--- BOUNDARY --- BOUNDARY --- BOUNDARY这样的东西就足够了。
答案 3 :(得分:0)
对于Swift人员(平衡Java):
func createBoundaryString() -> String {
var str = ""
let length = arc4random_uniform(11) + 30
let charSet = [Character]("-_1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ")
for _ in 0..<length {
str.append(charSet[Int(arc4random_uniform(UInt32(charSet.count)))])
}
return str
}