6
6
import java .net .URL ;
7
7
import java .nio .file .Files ;
8
8
import java .nio .file .StandardCopyOption ;
9
+ import java .util .Date ;
9
10
import java .util .Map ;
10
11
11
12
import javax .ws .rs .core .Form ;
@@ -100,6 +101,22 @@ public ExportStatus getExportStatus(Object projectIdOrPath) throws GitLabApiExce
100
101
* @throws GitLabApiException if any exception occurs
101
102
*/
102
103
public File downloadExport (Object projectIdOrPath , File directory ) throws GitLabApiException {
104
+ return downloadExport (projectIdOrPath , directory , null );
105
+ }
106
+
107
+ /**
108
+ * Download the finished export.
109
+ *
110
+ * <pre><code>GitLab Endpoint: GET /projects/:id/export/download</code></pre>
111
+ *
112
+ * @param projectIdOrPath the project in the form of an Integer(ID), String(path), or Project instance
113
+ * @param directory the File instance of the directory to save the export file to, if null will use "java.io.tmpdir"
114
+ * @param filename Name to give to the downloaded file. If null then we try to get from Content-Disposition header
115
+ * or to compute one from parameters
116
+ * @return a File instance pointing to the download of the project export file
117
+ * @throws GitLabApiException if any exception occurs
118
+ */
119
+ public File downloadExport (Object projectIdOrPath , File directory , String filename ) throws GitLabApiException {
103
120
104
121
Response response = getWithAccepts (Response .Status .OK , null , MediaType .MEDIA_TYPE_WILDCARD ,
105
122
"projects" , getProjectIdOrPath (projectIdOrPath ), "export" , "download" );
@@ -108,8 +125,28 @@ public File downloadExport(Object projectIdOrPath, File directory) throws GitLab
108
125
if (directory == null )
109
126
directory = new File (System .getProperty ("java.io.tmpdir" ));
110
127
111
- String disposition = response .getHeaderString ("Content-Disposition" );
112
- String filename = disposition .replaceFirst ("(?i)^.*filename=\" ?([^\" ]+)\" ?.*$" , "$1" );
128
+ if (filename == null ) {
129
+ // No filename provided
130
+ String disposition = response .getHeaderString ("Content-Disposition" );
131
+ if (disposition == null ) {
132
+ // On GitLab.com the Content-Disposition returned is null
133
+ if (projectIdOrPath instanceof Project ) {
134
+ String template = "%1$tY-%1$tm-%1$td_%1$tH-%1$tM-%1$tS_%2$s_export.tar.gz" ;
135
+ filename = String .format (template , new Date (), ((Project ) projectIdOrPath ).getPathWithNamespace ().replace ('/' , '_' ));
136
+ // filename = "2019-06-10_10-28-52_namespace-group_test-project_export.tar.gz"
137
+ } else if (projectIdOrPath instanceof String ) {
138
+ String template = "%1$tY-%1$tm-%1$td_%1$tH-%1$tM-%1$tS_%2$s_export.tar.gz" ;
139
+ filename = String .format (template , new Date (), projectIdOrPath );
140
+ // filename = "2019-06-10_10-28-52_test-project_export.tar.gz"
141
+ } else if (projectIdOrPath instanceof Integer ) {
142
+ String template = "%1$tY-%1$tm-%1$td_%1$tH-%1$tM-%1%tS_projectid-%2$d_export.tar.gz" ;
143
+ filename = String .format (template , new Date (), projectIdOrPath );
144
+ // filename = "2019-06-10_10-28-52_projectid_3115610_export.tar.gz"
145
+ }
146
+ } else {
147
+ filename = disposition .replaceFirst ("(?i)^.*filename=\" ?([^\" ]+)\" ?.*$" , "$1" );
148
+ }
149
+ }
113
150
File file = new File (directory , filename );
114
151
115
152
InputStream in = response .readEntity (InputStream .class );
0 commit comments