205 lines
5.0 KiB
Markdown
205 lines
5.0 KiB
Markdown
# Mobile Integration Guide
|
|
|
|
This document outlines the requirements for mobile applications to integrate with the Simple File Upload Server.
|
|
|
|
## API Endpoints
|
|
|
|
### Upload File
|
|
**Endpoint:** `POST /upload`
|
|
**Content-Type:** `multipart/form-data`
|
|
|
|
**Request Parameters:**
|
|
```
|
|
file: File (required) - The file to upload
|
|
max_downloads: Integer (optional) - Maximum number of downloads allowed (default: 1)
|
|
expiry_hours: Integer (optional) - Hours until file expires (default: 24, max: 24)
|
|
```
|
|
|
|
**Example Request (Swift):**
|
|
```swift
|
|
let url = URL(string: "http://your-server:7777/upload")!
|
|
var request = URLRequest(url: url)
|
|
request.httpMethod = "POST"
|
|
|
|
let boundary = "Boundary-\(UUID().uuidString)"
|
|
request.setValue("multipart/form-data; boundary=\(boundary)", forHTTPHeaderField: "Content-Type")
|
|
|
|
var body = Data()
|
|
// Add file data
|
|
body.append("--\(boundary)\r\n")
|
|
body.append("Content-Disposition: form-data; name=\"file\"; filename=\"log.txt\"\r\n")
|
|
body.append("Content-Type: text/plain\r\n\r\n")
|
|
body.append(fileData)
|
|
body.append("\r\n")
|
|
// Add parameters
|
|
body.append("--\(boundary)\r\n")
|
|
body.append("Content-Disposition: form-data; name=\"max_downloads\"\r\n\r\n")
|
|
body.append("3\r\n")
|
|
body.append("--\(boundary)\r\n")
|
|
body.append("Content-Disposition: form-data; name=\"expiry_hours\"\r\n\r\n")
|
|
body.append("24\r\n")
|
|
body.append("--\(boundary)--\r\n")
|
|
|
|
request.httpBody = body
|
|
```
|
|
|
|
**Example Request (Kotlin):**
|
|
```kotlin
|
|
val file = File("log.txt")
|
|
val requestBody = MultipartBody.Builder()
|
|
.setType(MultipartBody.FORM)
|
|
.addFormDataPart(
|
|
"file",
|
|
file.name,
|
|
file.asRequestBody("application/octet-stream".toMediaType())
|
|
)
|
|
.addFormDataPart("max_downloads", "3")
|
|
.addFormDataPart("expiry_hours", "24")
|
|
.build()
|
|
|
|
val request = Request.Builder()
|
|
.url("http://your-server:7777/upload")
|
|
.post(requestBody)
|
|
.build()
|
|
```
|
|
|
|
**Success Response:**
|
|
```json
|
|
{
|
|
"code": "ABC123"
|
|
}
|
|
```
|
|
|
|
**Error Responses:**
|
|
```json
|
|
{
|
|
"error": "No file part"
|
|
}
|
|
```
|
|
Status: 400 Bad Request
|
|
|
|
```json
|
|
{
|
|
"error": "No selected file"
|
|
}
|
|
```
|
|
Status: 400 Bad Request
|
|
|
|
### Download File
|
|
**Endpoint:** `GET /download/{code}`
|
|
|
|
**Parameters:**
|
|
- `code`: 6-character alphanumeric code received from upload
|
|
|
|
**Example Request (Swift):**
|
|
```swift
|
|
let code = "ABC123"
|
|
let url = URL(string: "http://your-server:7777/download/\(code)")!
|
|
let task = URLSession.shared.downloadTask(with: url) { localURL, response, error in
|
|
guard let localURL = localURL else { return }
|
|
// Handle downloaded file
|
|
}
|
|
task.resume()
|
|
```
|
|
|
|
**Example Request (Kotlin):**
|
|
```kotlin
|
|
val code = "ABC123"
|
|
val request = Request.Builder()
|
|
.url("http://your-server:7777/download/$code")
|
|
.get()
|
|
.build()
|
|
|
|
client.newCall(request).enqueue(object : Callback {
|
|
override fun onResponse(call: Call, response: Response) {
|
|
// Handle downloaded file
|
|
}
|
|
override fun onFailure(call: Call, e: IOException) {
|
|
// Handle error
|
|
}
|
|
})
|
|
```
|
|
|
|
**Success Response:**
|
|
- Status: 200 OK
|
|
- Content-Type: application/octet-stream
|
|
- Content-Disposition: attachment; filename="original_filename.ext"
|
|
|
|
**Error Responses:**
|
|
- Status: 404 Not Found
|
|
- Content-Type: application/json
|
|
|
|
Various error messages:
|
|
```json
|
|
{
|
|
"error": "Invalid or expired code"
|
|
}
|
|
```
|
|
```json
|
|
{
|
|
"error": "File expired"
|
|
}
|
|
```
|
|
```json
|
|
{
|
|
"error": "Download limit reached"
|
|
}
|
|
```
|
|
```json
|
|
{
|
|
"error": "File not found"
|
|
}
|
|
```
|
|
|
|
## Implementation Requirements
|
|
|
|
### File Upload
|
|
1. Implement proper error handling for network issues
|
|
2. Show upload progress to user
|
|
3. Handle timeout scenarios (recommended timeout: 60 seconds)
|
|
4. Store received code securely if needed
|
|
5. Validate file size before upload (max size: 16MB)
|
|
6. Implement retry logic for failed uploads
|
|
|
|
### File Download
|
|
1. Handle all error scenarios gracefully
|
|
2. Show download progress to user
|
|
3. Validate downloaded file integrity
|
|
4. Implement proper file saving logic
|
|
5. Handle interrupted downloads with resume capability if possible
|
|
|
|
### Security Considerations
|
|
1. Use HTTPS for all API calls in production
|
|
2. Don't store sensitive files for extended periods
|
|
3. Implement proper error messages without exposing server details
|
|
4. Sanitize all user inputs
|
|
5. Handle session timeouts appropriately
|
|
|
|
## Testing Requirements
|
|
1. Test with various file types and sizes
|
|
2. Verify all error scenarios
|
|
3. Test network condition variations:
|
|
- Slow network
|
|
- Intermittent connectivity
|
|
- Network switches (WiFi to Cellular)
|
|
4. Test concurrent uploads/downloads
|
|
5. Verify proper cleanup of temporary files
|
|
|
|
## Sample Status Codes
|
|
- 200: Success
|
|
- 400: Bad Request (invalid parameters)
|
|
- 404: Not Found (invalid code or expired file)
|
|
- 413: Payload Too Large (file size exceeded)
|
|
- 500: Server Error
|
|
|
|
## Rate Limiting
|
|
- Maximum 10 requests per minute per IP
|
|
- Implement exponential backoff for retries
|
|
|
|
## Migration Notes
|
|
If upgrading from previous versions:
|
|
1. Update API endpoint URLs
|
|
2. Implement new error handling
|
|
3. Update file size limits
|
|
4. Add support for download codes
|
|
5. Remove old URL-based download logic |