@@ -237,7 +237,7 @@ func FsPreup(c *gin.Context) {
237
237
common .ErrorResp (c , fmt .Errorf ("invalid request body: %w" , err ), 400 )
238
238
return
239
239
}
240
-
240
+
241
241
// 基本参数验证
242
242
if req .Name == "" {
243
243
common .ErrorResp (c , fmt .Errorf ("file name is required" ), 400 )
@@ -247,9 +247,15 @@ func FsPreup(c *gin.Context) {
247
247
common .ErrorResp (c , fmt .Errorf ("file size must be greater than 0" ), 400 )
248
248
return
249
249
}
250
-
250
+
251
251
storage := c .Request .Context ().Value (conf .StorageKey ).(driver.Driver )
252
252
path := c .Request .Context ().Value (conf .PathKey ).(string )
253
+ if ! req .Overwrite {
254
+ if res , _ := fs .Get (c .Request .Context (), path , & fs.GetArgs {NoLog : true }); res != nil {
255
+ common .ErrorStrResp (c , "file exists" , 403 )
256
+ return
257
+ }
258
+ }
253
259
254
260
res , err := fs .Preup (c .Request .Context (), storage , path , req )
255
261
if err != nil {
@@ -261,50 +267,56 @@ func FsPreup(c *gin.Context) {
261
267
262
268
// FsUpSlice 流式上传分片 - 使用PUT方法进行流式上传,避免表单上传的内存占用
263
269
func FsUpSlice (c * gin.Context ) {
270
+ defer func () {
271
+ if n , _ := io .ReadFull (c .Request .Body , []byte {0 }); n == 1 {
272
+ _ , _ = utils .CopyWithBuffer (io .Discard , c .Request .Body )
273
+ }
274
+ _ = c .Request .Body .Close ()
275
+ }()
264
276
// 从HTTP头获取参数
265
277
taskID := c .GetHeader ("X-Task-ID" )
266
278
if taskID == "" {
267
279
common .ErrorResp (c , fmt .Errorf ("X-Task-ID header is required" ), 400 )
268
280
return
269
281
}
270
-
282
+
271
283
sliceNumStr := c .GetHeader ("X-Slice-Num" )
272
284
if sliceNumStr == "" {
273
285
common .ErrorResp (c , fmt .Errorf ("X-Slice-Num header is required" ), 400 )
274
286
return
275
287
}
276
-
288
+
277
289
sliceNum , err := strconv .ParseUint (sliceNumStr , 10 , 32 )
278
290
if err != nil {
279
291
common .ErrorResp (c , fmt .Errorf ("invalid X-Slice-Num: %w" , err ), 400 )
280
292
return
281
293
}
282
-
294
+
283
295
sliceHash := c .GetHeader ("X-Slice-Hash" )
284
-
296
+
285
297
// 构建请求对象
286
298
req := & reqres.UploadSliceReq {
287
299
TaskID : taskID ,
288
300
SliceHash : sliceHash ,
289
301
SliceNum : uint (sliceNum ),
290
302
}
291
-
303
+
292
304
// 获取请求体作为流
293
305
reader := c .Request .Body
294
306
if reader == nil {
295
307
common .ErrorResp (c , fmt .Errorf ("request body is required" ), 400 )
296
308
return
297
309
}
298
-
310
+
299
311
storage := c .Request .Context ().Value (conf .StorageKey ).(driver.Driver )
300
-
312
+
301
313
// 调用流式上传分片函数
302
314
err = fs .UploadSlice (c .Request .Context (), storage , req , reader )
303
315
if err != nil {
304
316
common .ErrorResp (c , fmt .Errorf ("upload slice failed: %w" , err ), 500 )
305
317
return
306
318
}
307
-
319
+
308
320
common .SuccessResp (c )
309
321
}
310
322
@@ -316,12 +328,12 @@ func FsUpSliceComplete(c *gin.Context) {
316
328
common .ErrorResp (c , fmt .Errorf ("invalid request body: %w" , err ), 400 )
317
329
return
318
330
}
319
-
331
+
320
332
if req .TaskID == "" {
321
333
common .ErrorResp (c , fmt .Errorf ("task_id is required" ), 400 )
322
334
return
323
335
}
324
-
336
+
325
337
storage := c .Request .Context ().Value (conf .StorageKey ).(driver.Driver )
326
338
rsp , err := fs .SliceUpComplete (c .Request .Context (), storage , req .TaskID )
327
339
if err != nil {
0 commit comments