УЖЕ, забудь, что я выложил здесь ранее.
Это не так просто, как мы думали.
Некоторые ссылки, которые я предлагаю вам прочитать:
- API CouchDB Document
- (черновик) Core API
Хорошо.
Первое решение, если вы хотите «Автономный» или «встроенные вложения». В настоящее время я не знаю, что такое «за» и «против», НО, основываясь на вашем коде, и что я сделал, мы перейдем к «Автономному».
Во-первых, вам нужен номер версии (ревизии) документа, к которому вы хотите прикрепить свое изображение. Согласно приведенной выше ссылке, сделайте это, выполнив запрос Head для этого документа:
private String getParentRevision(String uuid, HttpClient httpClient) {
String rev = "";
try {
HttpHead head = new HttpHead("http://192.168.56.101/testforms/" + uuid + "/");
HttpResponse resp = httpClient.execute(head);
Header[] headers = resp.getAllHeaders();
getLog().debug("Dumping headers from head request");;
for (Header header : headers) {
getLog().debug(header.getName() + "=" + header.getValue());
if ("Etag".equals(header.getName())) {
StringBuilder arg = new StringBuilder(header.getValue());
if (arg.charAt(0) == '"') {
arg.delete(0, 1);
}
if (arg.charAt(arg.length()-1) == '"'){
arg.delete(arg.length()-1, arg.length());
}
rev = arg.toString();
break;
}
}
} catch (Exception ex) {
getLog().error("Failed to obtain DOC REV!", ex);
}
return rev;
}
Я прошу прощения за жесткое кодирование и т. Д., Я учусь и экспериментирую здесь;)
Параметр «uuid» - это UUID целевого документа.
Обратите внимание на удаление переносимых символов "" ", когда мы получили Etag (да, заголовок Etag - это номер редакции).
ТОГДА, когда мы получили это, мы действительно можем отправить изображение:
String serveURL = "http://192.168.56.101/testforms/" + data.getString(PARENT_UUID) + "/" + imgUuid;
if (docRev != null && !docRev.trim().isEmpty()) {
//This is dumb...
serveURL += "?rev=" + docRev + "&_rev=" + docRev;
}
HttpPut post = new HttpPut(serveURL);
ByteArrayEntity entity = new ByteArrayEntity(imageData);
entity.setContentType(data.getString(MIME_TYPE));;
post.setEntity(entity);
HttpResponse formServResp = httpClient.execute(post);
Благодаря этому я смог прикрепить изображения к своим документам;)
Как уже упоминалось, учтите, что я тоже новичок в CouchDB, поэтому могут быть более простые способы сделать это!
Что-то, что я только что обнаружил сейчас (но должен был заметить ранее), это то, что здесь есть возможность возникновения состояния гонки, если, например, несколько клиентов пытаются прикрепить изображения к одному и тому же документу одновременно. Причина в том, что значение rev меняется с каждым изменением документа.
В таком случае вы получите ответ от сервера, например
{"error":"conflict","reason":"Document update conflict."}
Самое простое решение - просто повторить попытку в таком случае, пока оно не сработает, или пока не будет достигнут установленный лимит ошибок ...
Ура!