1.设置settings.py文件指向的urls.py文件,如下:
from api.views import upload_view
url(r'^upload/$', upload_view),
2.实现/upload/接口,api/views.py文件有如下内容:
@csrf_exempt
def upload_view(request):
"""
method: POST
api: /upload/
"""
fp = request.FILES.get('file')
compress = request.POST.get('compress')
response = {}
if fp:
src_fn = save_original_image(fp)
# settings.HOST_NAME请根据自己的要求设置
response['url'] = 'http://%s/%s' % (settings.HOST_NAME, src_fn)
if compress:
to_fn = compress_image(src_fn)
response['thumbnail_url'] = 'http://%s/%s' % (settings.HOST_NAME, to_fn)
return JsonResponse(response)
以下是上面功能依赖的辅助函数
UPLOAD_DIR_FORMAT = '%Y%m%d'
DATETIME_FORMAT = '%Y-%m-%d %H:%M:%S'
UPLOAD_DIR_FORMAT = '%Y%m%d'
DATE_FORMAT = '%Y-%m-%d'
TIME_FORMAT = '%H:%M:%S'
def datetime_to_str(x=None, fmt=DATETIME_FORMAT):
x = x if x else datetime.datetime.now()
return x.strftime(fmt)
def date_to_str(x=None, fmt=DATE_FORMAT):
return datetime_to_str(x, fmt)
def save_original_image(fp):
subdir = date_to_str(datetime.date.today(), UPLOAD_DIR_FORMAT)
# settings.UPLOAD_ROOT设置为UPLOAD_ROOT = os.path.join(BASE_DIR, 'images')
path = os.path.join(settings.UPLOAD_ROOT, subdir)
if not os.path.exists(path):
os.mkdir(path)
with open(os.path.join(path, fp.name), 'wb') as dst_fp:
for chunk in fp.chunks():
dst_fp.write(chunk)
return os.path.join(os.path.basename(settings.UPLOAD_ROOT), subdir, fp.name)
def compress_image(filename):
rear = filename[filename.rfind('.'):]
thumbnail_fn = filename.replace(rear, '-thumbnail'+rear)
image = Image.open(os.path.join(settings.BASE_DIR, filename))
image.thumbnail((128, 128))
image.save(os.path.join(settings.BASE_DIR, thumbnail_fn), 'JPEG')
return thumbnail_fn
3.至此,文件上传接口完成下面实现测试用例:
先在项目的data文件夹添加图片文件data/111.jpg,做好准备后,下面是代码:
class TestCommonFunction(TestCase):
def test_upload_view(self):
"""
python manage.py test --settings=proj_name.settings-test api.tests.TestCommonFunction.test_upload_view
"""
url = '/upload/'
client = Client()
resp = self.client.get(url)
self.assertFalse(json.loads(resp.content))
with open('data/111.jpg', 'rb') as fp:
response = client.post(url, data={'file': fp})
json_resp = json.loads(response.content)
self.assertTrue('url' in json_resp)
self.assertEquals(len(json_resp), 1)
with open('data/111.jpg', 'rb') as fp:
response = client.post(url, data={'file': fp, 'compress': 1})
json_resp = json.loads(response.content)
self.assertTrue('url' in json_resp)
self.assertTrue('thumbnail_url' in json_resp)
self.assertEquals(len(json_resp), 2)
收工