removed tinyurl logic added support for new short code logic
This commit is contained in:
205
MOBILE.md
Normal file
205
MOBILE.md
Normal file
@@ -0,0 +1,205 @@
|
||||
# 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
|
||||
Reference in New Issue
Block a user