Skip to content

Commit c24340f

Browse files
provokateurinbackportbot[bot]
authored andcommitted
fix(FilesDropPlugin): Fix name conflict resolution for chunked uploads
Signed-off-by: provokateurin <[email protected]>
1 parent 24c1a98 commit c24340f

File tree

1 file changed

+19
-4
lines changed

1 file changed

+19
-4
lines changed

apps/dav/lib/Files/Sharing/FilesDropPlugin.php

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)