Python3.5 Django1.9.3 圖片上傳與返回
Django框架對於靜態檔案的上傳和返回有良好的支援,下面分為圖片上傳和下載兩個部分來簡單記錄。
檔案上傳
安卓客戶端上傳:
點選上傳按鈕後會像伺服器傳送一個file,其中file是一個File型別的檔案。
User.getInstance().upload(file,"http://192.168.1.104:8000/user/user_upload/");
//測試上傳圖片 User.java檔案中,為一個單例 使用android-async-http-1.4.8框架
public void upload(File file, String url)throws Exception{
if (file.exists() && file.length() > 0) {
RequestParams params = new RequestParams();
params.put("username", "ykh");
params.put("headImg", file);
httpClient.post(url, params, new AsyncHttpResponseHandler() {
@Override
public void onSuccess(int i, Header[] headers, byte[] bytes) {
Log.e("photo", "onSuccess");
}
@Override
public void onFailure(int i, Header[] headers, byte[] bytes, Throwable throwable) {
Log.e("photo", "onFailure");
}
});
}else
{
Log.e("photo", "檔案不存在");
}
}
伺服器端接收:
在urls中設定對應的路由,不再贅述,upload的file將被存在portrait = models.FileField(upload_to = './upload') #使用者頭像
(其中upload_to將指定上傳後文件的儲存目錄,我儲存在專案的主路徑下的upload資料夾下)這樣一個modul欄位中。
伺服器儲存接收到的圖片的程式碼如下:
class UserForm(forms.Form):
username = forms.CharField()
headImg = forms.FileField()
def user_upload(request):
if request.method == "POST":
uf = UserForm(request.POST,request.FILES)
if uf.is_valid():
username = uf.cleaned_data['username']
badge_image = uf.cleaned_data['headImg']
user = User()
user.username = username
user.portrait = badge_image
user.save()
code = 0
else:
uf = UserForm()
code = 1
data={'code':code}
return HttpResponse(json.dumps(data))
如果不出意外的話你究可以在工程目錄下的upload資料夾下看到你在安卓端上傳的圖片了。
圖片下載(圖片生成url)
在Django的專案資料夾下的setting.py中新增這樣兩句話:
HERE=os.path.dirname(os.path.dirname(__file__))
STATIC_URL= '/static/'
STATICFILES_DIRS = (
os.path.join(HERE,'D:\BitBucket\goSportServer\media').replace('\\','/'),
os.path.join(HERE,'D:\桌面資料夾\photo').replace('\\','/'),
)
其中的檔案路徑對於的就是你電腦或者伺服器的物理碟符路徑,假設你在D:\桌面資料夾\photo 資料夾下放了一張大圖片,像我這樣:
那麼,你現在開啟服務後直接在瀏覽器中輸入http://192.168.1.104:8000/static/1.jpg
地址就可以看到這張圖片了,具體的原理我也不細說了,大概是static被對映到你的物理路徑D:\桌面資料夾\photo上,然後後面跟上你要讀取的檔名就可以了。當然,你也可以在STATICFILES_DIRS中寫 os.path.join(HERE,’D:\桌面資料夾’).replace(‘\’,’/’),然後在瀏覽器中輸入http://192.168.1.104:8000/static/photo/1.jpg
來讀取檔案,主要的思想就是你寫的static對映的目錄在拼接上你在瀏覽器中輸入的static之後的地址形成你伺服器或者電腦中對應的預處理的檔案的實體地址即可,是不是很簡單。
給個效果圖:
你可以在STATICFILES_DIRS中新增許多物理目錄,來實現手工對映,比較麻煩,對靜態檔案處理有比較高的要求的話可以使用django的自動對映方法。