JavaScript客户端- U. ?* [4 K& \) z2 Y
0 ^' \: i. y# V/ @" {8 {* y! }
本教程旨在为您示范如何用WebdavClient Javascript类对您的AutoCAD WS账户中的文件和文件夹执行各种操作。使用这个JavaScript类,您可以——/ |) b \ p4 R9 c9 C
0 e& M# T2 G2 g) v0 o, \1 ~4 j
1.连接到一个AutoCAD WS账户上
2 B- G% t( ~8 z7 u% T
0 }) h; ?, x6 X- p9 c( k 2.查询账户文件/文件夹结构1 Y- M% H7 `4 W% S; t9 ^
& j0 D) ]6 b' t1 h4 V- [0 T 3.执行不同的文件操作,例如复制、粘贴、重命名、创建文件夹' i+ m% ?. s9 C- o: q* P
7 ?% w3 I% ^1 F 4.上传和下载文件
1 I! t0 G* U, H; x" i0 Z6 |# ]2 i/ U3 o0 D! F2 p! t
5.查询文件元数据,例如最后修改、权限、缩略图
6 X/ J+ D6 m2 i1 f! J8 U, ~/ S* ~$ S
在WS在线编辑器中启动图纸文件
2 b4 ^! l1 ^. { m3 D8 C3 |
6 i9 D% ~; d2 i7 {% `( e WebdavClient JS类依靠标准的WebDAV协议来和AutoCAD WS服务进行通信。C++、C#、Java和JavaScript等多种编程语言都支持这个基于http的行业协议。点击这里观看使用C#语言访问AutoCAD WS的教程。这个教程示范了如何在JavaScript中执行上述操作。我们还在下方嵌入了可供下载的客户端源代码。点击这里下载这个示范样例的完整源代码。0 ~3 m- t7 y+ p/ [$ V* ^& W
|/ ?! H6 C4 g. y% z
构造器! V4 r. A' J# j4 N
% d, s a0 w h) Z WeddavClient类构造器需要三个参数:
8 e- r% d X7 L+ ?/ `/ ^, p; ~9 i6 r. P2 N# o0 B* s
1. url:Webdav服务器地址。例如,如果您要连接到AutoCAD WS服务器,就用 “https://dav.autocadws.com”。 T& @" O8 C4 `
! ?# a; H0 W* w' V- q 2. 用户名:您在Webdav服务器中的账户名
, N5 Y( x" W9 E4 Z
) c1 r" S5 p4 J 3. 密码:您在Webdav服务器中的账户密码( R* R2 x/ Z1 W/ C% b$ _
1 b5 X2 `( M v" N/ r
下面的代码创建出新的WebdavClient类,连接到AutoCAD WS Webdav服务器,使用的用户名是“someuser”,密码是“123456”。. t3 D, d$ V8 ]) D4 f
! m+ d8 \4 P4 L; n: h" O5 f1 S' k var client = new WebdavClient(’https://dav.autocadws.com’, ’someuser’, ’123456’);
+ x. w5 e0 V b: G: x5 X$ |' z' x% [4 J f
PROPFIND
. A" Y) g [% e# Y5 T+ D$ p0 ?/ {
3 S+ L: u% A' M( {; e7 h PROPFIND方法用来在AutoCAD WS账户中检索关于文件和文件夹的信息。
/ Z) D0 H0 v) ]* z) F. j! p$ t3 }+ J/ g
PROPFIND函数接收三个参数:
' j2 _/ W4 N7 j$ ]6 B8 j* @3 h' ?9 U3 E; ?" [8 p4 g
1. 处理器:一种可定义onError回调函数和onSuccessan回调函数的对象,这两种函数分别在请求过程中出错时和成功完成请求时调用。: I: C" ^3 C! o9 G& X M. T
+ f& S7 y' l! g 2. 路径:我们想检索信息的文件夹/文件的相对路径。
3 A% X; P, G" L
: F" L2 W+ d; V, H8 B' b, k4 D 3. 深度:表示该方法是仅适用于资源(深度=“0”)、仅适用于资源及其内部成员(深度=“1”),还是适用于资源及其所有成员(深度=“无限”)。, B$ j7 @$ H; k O" a+ F
* R9 K9 m0 f2 Z: K
下列代码向服务器发送PROPFIND请求,以获取直接位于‘/Site’文件夹下的所有文件/文件夹的信息。5 V, D% p' j( M1 {! E2 E
- z- m4 X% [+ b* I6 m( S //A handler the implements onSuccess and onError functions
) j0 T: ]4 [7 q- V; Y' w1 w# s. W6 L" k) b5 ]# z& H
var handler = new PropfindHandler();
; T4 e+ ?, w- {! y3 i4 O% b' F
5 M4 U& `' k6 ^# a. P // request properties of all files/folders residing directly under the ’Site’ folder.
& K8 P6 f" g$ r# |# T
" g: K4 N( d% e client.PROPFIND(handler, ’/Site’, 1);4 I1 A& b& \3 [0 Y+ v
" Q! W2 s/ ^! Q$ U# @& o4 D( x
这个范例使用了PropfindHandle。我们稍后就展示该对象的代码。但是在这之前我们应该看看来自Webdav服务器的响应。服务器返回了一个含有文件/文件夹信息的XML。下面是这种XML的一个示例:
5 y/ C" d% O, Y
. ^: M* C4 h% v; Z& ]# S+ Y
3 H/ _5 s% N. H' [3 F& V
( @, N$ ] O5 b- o2 f6 X# P, e* j" E # Q# `2 r4 {+ L( B3 c4 J* k7 n
# T2 Y1 t5 _6 l
% ], Z! N( c8 D9 `0 C; g$ R7 t# P6 m* I) e" `- P' H
/Site/filea.dwg
/ _( u# z' H4 a( _1 I+ \" a) U# ?: z
$ c: ~* [% [6 K! |1 a3 f& ]
- Q8 R: w4 y7 o2 r2 u w HTTP/1.1 200 OK
2 D; e1 j( {0 t; Z9 f7 k ?) w) l4 z1 Q6 {' R% f0 Q
( S' Z. X `1 j2 V
9 O6 v0 ^1 X+ X# j) t8 c3 U+ ` 2011-12-01T17:42:21-08:00
0 @% ?. w( ?9 i A A8 v# J
1 d, }- A6 [5 Q' r) {# L- n filea.dwg
% t) {- h, B+ I- {8 N$ W4 j' w1 s: v: a3 a: I! C
2 d* F( C; x! ?+ y# M+ r1 p% ~6 ~( x9 G' `& n
/ I8 W, t8 |4 C4 ]) O+ D7 i# f6 N
5 P3 f1 J2 {0 \7 R1 {1 g8 U
* h( ?( H3 U I4 b
X9 ]/ i, S. o% u+ o+ S$ g+ U1 j" Z- u 1 b& g+ C; v& r1 A
- n# N H5 W6 h* t /Site/fileb.dwg% V k( [1 B8 t
' ^; T _8 q7 W$ G& T3 @7 v- f, l
+ c4 d- I' A. M
+ Z5 u |( y7 y4 M: z HTTP/1.1 200 OK
+ I9 {* B6 B8 y* {% F" V
/ U1 ?+ t4 U# |$ h4 K4 S
$ t' j4 q) v0 t: F0 g, N/ Q2 Q( X" k+ s! d9 O+ b+ V
2011-12-01T17:42:21-08:00
, F1 J0 w* }) y% E
8 y, Q5 }6 R% e4 n, d fileb.dwg
+ \0 W& R( f% P* D4 }$ L1 s
' I& e# G- n {5 `1 d- z: T
2 ~# k, {6 W% R, r" i) y. V5 `3 g9 w" M! q3 u6 q4 n
6 A" n! q0 F) _# m* v7 e. l3 E
! ^. b/ r: [& e' W D+ g ' |- v" ~+ }" k P5 ?4 |( J
$ t( s) `7 A6 f% m2 a9 H 3 i, _' j7 q5 }; B T) g! c+ W) |" j
# C) z- \4 K% t- E- O2 \
如您所见,每个文件/文件夹均返回到“d:response”标签中。在这种情况下,服务器返回“filea.dwg”和“fileb.dwg”这两个文件的信息。服务器注明了每个文件的创建日期和文件名。, V+ B, |$ p' \& c2 B2 r- {, {, G
1 k* E+ t* o2 J( h0 E7 S 您可能希望处理器的onSuccess函数能够解析已返回的XML,并对检索到的信息进行某些处理。
$ P' ^, l* f% {$ p- x
7 h) J% ]* y$ j, K 下面的代码展示的是非常简单的PropfindHandler,它显示了一个警告消息框,在出错的情况下这个消息框里含有状态代码,在成功的情况下则含有服务器返回的文件/文件夹名称:
6 s- G7 {# v- k
1 J; _% ~. A! { e function PropfindHandler()0 `8 ^+ q. F" G
3 n2 K- \* i* H
{9 b& f- ~4 E# s; d z1 L8 x
& k' J+ w$ z6 m0 G7 g" D) s9 Q9 i4 s }
% H: M2 Z2 s* s* q( r! K0 Z
# Z4 l) p& k; r- h PropfindHandler.prototype.onSuccess = function(result)
" x& I6 A( o- T& f4 @. _9 Z; M' L7 ?6 h) y1 h g4 N0 ]( F' s
{
( P1 P* V4 e) k. F. e! G8 e F' M/ d9 \3 O
var names = ’’;) Z2 l. R; i1 Z8 Q; O' H- b+ Y0 v
" x7 r) ~) x1 U* E // each file/folder is defined within a ’response’ tag
% |5 I- g. E! Q, ~* d
8 c; b% F2 ]0 N# _) u var items = this.getElementByTagName(result.content, ’d’, ’response’);; |) s$ K" {7 G* e; e q
9 K A- t( K! Q3 C for (i = 0; i < items.length; i++)
( |+ N# r1 o3 j# M; w
4 ]+ d0 |! ~& M* a0 O8 K {% D0 Y& t; R7 w
2 S1 S$ s0 C* i& Z8 H
var props = this.getElementByTagName(items, ’d’, ’prop’)[0];$ D8 B# t& e- q0 {# b
& P2 T& `7 I" ^4 x4 M( ]8 [ var displayNameTag = this.getElementByTagName(props, ’d’, ’displayname’)[0];2 r, x/ g. @* r7 j1 L
/ {$ ^; R1 t% J
var displayName = displayNameTag.childNodes[0].nodeValue;
+ _* H; n6 y2 b* l
; n- f9 }5 U3 d( u/ q names += displayName + ’/n’;
1 [1 X4 w2 o1 k$ B
% B y$ W5 B/ [6 P6 U | }( b2 w0 H3 B/ |6 D8 k! Q4 B/ B# |3 f
3 r/ v1 e- |9 a B* c7 \$ v$ K. Z3 ~
alert(names);
5 [( i0 }; e: u% I9 w/ t7 i# a
6 i0 R1 B5 i% W2 O6 H };0 M9 C( r1 q2 c2 U
, V: G. B) `* A6 h* O PropfindHandler.prototype.onError = function(result)
2 N* `8 q% w! b7 k" i% ? r: g9 Q
, W8 o, m" B) B# Z0 F0 J6 w {; }' M% q9 s3 ~6 Y
: g' `, {# d, [0 C9 X alert(result.status);$ p7 T6 U$ w; l0 H; p$ b) I
3 E/ Q H1 b! G }
( r. k0 @5 h% F. i1 J$ S( u# k+ r+ y
如果以“someuser”为用户名的这个账户中包含文件夹“site”,而文件夹中有“filea.dwg”和“fileb.dwg”这两个文件,那么用户会看到一个消息框,其中显示了以下文件名:7 U' }. v3 _3 n
9 F6 O/ E6 V. }# t/ M& K; ?% e
filea.dwg
+ k$ v8 d! s1 Y0 V0 u+ h) e C( i6 F! d0 r& b
fileb.dwg
% k. g. `. d+ g; n9 b$ g
* I) \% C" C* |* I3 x r 复制、移动、删除: L* a1 f4 V+ A; a& k
/ r% J; j. V- Z. O$ o
复制、移动和删除的调用方式和PROPFIND方法一样,只是传递的参数有所不同。
$ i8 M+ x- o A& _: U2 {- f' k3 K- |# r& D/ G
它们都接收一个处理器对象,这一点与PROPFIND方法相似,但是在这种情况下没有需要解析的已返回信息。但是您应使用onSuccess和onError回调函数来了解请求是否已成功完成,并在出错时接收状态代码。7 E4 K! d# g% b% i- I2 X- y
9 c8 O+ d7 @( D& z; l
下列代码:* A$ h3 X8 B/ A4 h) b; `
I2 f" r: f+ c 1. copies ‘/Site/filea.dwg’ to /OtherSite/fileb.dwg’
& q. g3 k. B. ?5 J8 B. U% h% u6 @( ?& Z- w' ]! u
2. moves ‘/Site/filec.dwg’ to /OtherSite/filed.dwg’8 Q6 j; d# G* l O% n
* g& R; g7 S3 M. z5 R( b- W+ \ 3. deletes ‘/Site/filee.dwg’. L+ [/ i* u, t: G- h$ d$ ^' S
# f& V, l( p& O1 L9 d" [# G# K' T
var handler = new FSHandler();
' {8 a P L+ e+ E; u2 y4 E8 q& e+ R( i$ |& F" k
var overwrite = true;
" a) n9 U' z% x3 {- Y+ N" {
/ D3 U: L! l* G1 C) v: F' s% m client.COPY(handler, ’/Site/filea.dwg’, ’/OtherSite/fileb.dwg’, overwrite);* D# J/ X3 |( v
+ c& g* ~/ n- a% Y client.MOVE(handler, ’/Site/filec.dwg’, ’/OtherSite/filed.dwg’, overwrite);
' A$ w6 Q+ l5 r3 k
7 L+ L% @7 ], v/ L2 s+ | client.DELETE(handler, ’/Site/filee.dwg’);! F3 h8 I! o+ u$ @8 L* w
) j0 v) I! C# s1 s: c& ]2 v5 B
下面的代码显示了FSHandler对象,这个对象显示的消息框在成功完成请求的情况下将显示“success”,在出错的情况下则显示“error”和状态代码。# A0 R" j! R' v. O4 b
3 j+ s# @9 E' J" Z function FSHandler(); w. @4 n5 W" r& w7 A" K
' v i' A. v; Q5 S; E0 q( s
{6 q( p6 w3 l+ V' j( K1 H: k
1 z1 {8 b( w; v' A. j6 E
}
$ Z8 ?0 J, m, g5 l- ]* }6 x+ ]- m& {+ g
FSHandler.prototype.onSuccess = function(result)
% }) M$ X# N; Z5 N8 V. J% n6 p% M
. V1 K/ ~" p% J1 G. `; [. y {
: X/ m# o g% q( x n) S0 P% c( p+ M" ]! G x( L
alert(’success’);
1 c2 P4 Z% b+ _7 H% \' P, \, f7 [: `# r- j& D
};
% ], _0 s* e \6 j9 z2 z% U
6 \9 m9 T. q$ e$ L# p/ K/ A# K FSHandler.prototype.onError = function(result)! |9 D% c5 ?: b: P3 @# i
: w. C4 p$ r. ~! m* ~ {
_6 t. i9 ~3 k
* s* W5 b: C, ^; @" p alert(’error: ’ + result.status);9 P3 ]* B0 ?& W* s: E
" H1 P }4 ^+ z: f1 I& [ P
}, O7 u* `( q! j! T) f
( L( T5 u) q& f0 Z% y 同域策略和proxy.php
' B( D2 l; b3 `
, i+ h( @$ V: c; c! R; P5 r' z 同源策略可阻止从一个源加载的文档或脚本获取或设置来自另一个源的文档的属性。+ F7 t4 p! L+ o, m8 S% R+ c
2 s4 w8 w/ m5 q; }+ y7 O% |, ?
这意味着我们不能将Webdav请求发送到与JS文件位于不同域的服务器上。 H; s9 e0 M# c0 |: k* g) h
& _4 _( o4 s* Z e0 E4 @3 M 这是一个问题,因为Webdav服务器可能位于与客户端不同的域中。我们将会用php代理服务器绕过这个问题。, \8 o5 ^# O3 W& C3 O4 E% j
: c% l4 `5 M7 ~/ |8 x) p% k
这个代理服务器应该与客户端位于同一个域。请求将被发送到代理服务器上,然后代理服务器把请求发送给Webdav服务器,再把应答返回到客户端。下面这行php文件信息定义了真正的Webdav服务器地址:
) W7 L y4 b2 @1 ]$ }
2 B3 q/ r( J0 D7 |- A, ~ $real_destination_host = "https://dav.autocadws.com";
1 C7 H1 T8 G& ^: U& p& c4 T6 l" q: S$ e2 Y) _
您必须确保您的服务器已完成了运行php文件所需的配置。
9 \, N( o8 q- o6 X' W# X7 O9 k- ~# s a* V w8 @* ~
点击这里获取指南,以了解如何安装和配置PHP 5,使之能够与Apache一起在Windows下运行。3 S9 r/ B. X- U/ o# z
* N* H: e7 K9 g) P, { 在AutoCAD WS编辑器中启动图纸文件
c, D. d0 W% O. G, D, j! H2 ~" q F% _* s
要在AutoCAD WS的在线编辑器中打开图纸文件,只需调用客户端OpenDrawing方法,以便用目标账户传递图纸文件的路径:
* }& @- ^$ E& ^) v- d# F3 r& h1 q( m( f
client.OpenDrawing(’/Site/filea.dwg’);
4 u1 Y/ x$ d3 ^: l) X: ] o) K0 @* @. R2 C4 \* O4 L- T
上传文件; y' J# _+ W1 A% k9 g/ S1 Z' m
& n0 F/ [" P# P
您或许想实施一种方式,让用户可以在他的本地文件系统上选择一个文件,然后上传到Webdav服务器上。1 p) N' I3 Z( m& `
/ O( q4 V5 x7 ?* d1 x
有些浏览器无法支持您访问用户的文件系统,所以有时候不一定能用javascript实施这项功能。
7 E H2 a) r. k. E
0 s( r; P5 C/ e$ [, I5 j8 K, c 在我们的样例中,我们用SWFUpload库来添加上传功能。8 ~/ V+ B0 l3 N; v: z
2 f/ l4 x9 g, Z9 i8 z. U' O$ n( u# b
SWFUpload是一个小型的JavaScript/Flash库,它使您可以在您的html里轻松添加“上传”(Upload)按钮。Flash代码通过Flash的ExternalInterface类来与JS代码通信。如需了解关于SWFUpload的更多信息及示例,请访问SWFUpload网站* ?" g1 t" J* P% n
: P4 t' I: |# g! d* p 以上来自 欧特克AU技术社区http://au.autodesk.com.cn |