@@ -67,7 +67,10 @@ private function isChunkedUpload(RequestInterface $request): bool {
6767 }
6868
6969 public function beforeMethod (RequestInterface $ request , ResponseInterface $ response ) {
70- if ($ this ->isChunkedUpload ($ request )) {
70+ $ isChunkedUpload = $ this ->isChunkedUpload ($ request );
71+
72+ // For the final MOVE request of a chunked upload it is necessary to modify the Destination header.
73+ if ($ isChunkedUpload && $ request ->getMethod () !== 'MOVE ' ) {
7174 return ;
7275 }
7376
@@ -107,8 +110,16 @@ public function beforeMethod(RequestInterface $request, ResponseInterface $respo
107110 // full path along the way. We'll only handle conflict
108111 // resolution on file conflicts, but not on folders.
109112
110- // e.g files/dCP8yn3N86EK9sL/Folder/image.jpg
111- $ path = $ request ->getPath ();
113+ if ($ isChunkedUpload ) {
114+ $ destination = $ request ->getHeader ('destination ' );
115+ $ baseUrl = $ request ->getBaseUrl ();
116+ // e.g files/dCP8yn3N86EK9sL/Folder/image.jpg
117+ $ path = substr ($ destination , strpos ($ destination , $ baseUrl ) + strlen ($ baseUrl ));
118+ } else {
119+ // e.g files/dCP8yn3N86EK9sL/Folder/image.jpg
120+ $ path = $ request ->getPath ();
121+ }
122+
112123 $ token = $ this ->share ->getToken ();
113124
114125 // e.g files/dCP8yn3N86EK9sL
@@ -199,7 +210,11 @@ public function beforeMethod(RequestInterface $request, ResponseInterface $respo
199210 $ relativePath = substr ($ folder ->getPath (), strlen ($ node ->getPath ()));
200211 $ path = '/files/ ' . $ token . '/ ' . $ relativePath . '/ ' . $ uniqueName ;
201212 $ url = rtrim ($ request ->getBaseUrl (), '/ ' ) . str_replace ('// ' , '/ ' , $ path );
202- $ request ->setUrl ($ url );
213+ if ($ isChunkedUpload ) {
214+ $ request ->setHeader ('destination ' , $ url );
215+ } else {
216+ $ request ->setUrl ($ url );
217+ }
203218 }
204219
205220 private function getPathSegments (string $ path ): array {
0 commit comments