将文件从iPhone上传到Django
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了将文件从iPhone上传到Django相关的知识,希望对你有一定的参考价值。
对不起,初学者的问题:我的Django应用程序中有一个非常简单的功能,我可以将其从Web浏览器上传到我的服务器(工作得很好!)。 现在,我想使用iPhone而不是网络浏览器。
我有点卡住,因为我真的不知道如何为Django提供有效的表单,即据我所知,我们需要一个文件名和enctype =“multipart / form-data”。
这是我在Django中的上传功能:
class UploadFileForm(forms.Form):
file = forms.FileField()
def handle_uploaded_file(f):
destination = open('uploads/example.txt', 'wb+')
for chunk in f.chunks():
destination.write(chunk)
destination.close()
def upload_file(request):
if request.method == 'POST':
form = UploadFileForm(request.POST, request.FILES)
if form.is_valid():
handle_uploaded_file(request.FILES['file'])
print form
print request.FILES
return HttpResponse('Upload Successful')
else:
form = UploadFileForm()
return render_to_response('upload.html', 'form': form)
我的模板看起来像这样(upload.html):
<form action="" method="post" enctype="multipart/form-data">
form.file
form.non_field_errors
<input type="submit" value="Upload" />
</form>
现在,让我们假设我想从我的iPhone应用程序向服务器发送一个简单的txt文件。 我真的不知道如何 :
- 提供文件名
- 指定
enctype
和 - 确保它是Django可以读取的格式
这是我得到了多远:
NSString *fileContents = [self loadTXTFromDisk:@"example.txt"];
NSMutableURLRequest *request = [[NSMutableURLRequest alloc]
initWithURL:[NSURL
URLWithString:@"http://127.0.0.1:8000/uploadfile/"]];
[request setHTTPMethod:@"POST"];
[request setValue:@"text/xml" forHTTPHeaderField:@"Content-type"];
[request setValue:[NSString stringWithFormat:@"%d", [fileContents length]]
forHTTPHeaderField:@"Content-length"];
[request setHTTPBody:[fileContents dataUsingEncoding:NSUTF8StringEncoding]];
NSURLConnection *theConnection = [[NSURLConnection alloc]
initWithRequest:request
delegate:self];
但是,Django除此之外不会因为它预期的形式无效。 参看 以上:
form = UploadFileForm(request.POST, request.FILES)
if form.is_valid(): #this will not be true ...
HTML表单中的enctype
应该是HTTP请求的Content-Type
。 您当前正在将内容类型设置为'text/xml'
。
您还必须将主体构建为多部分mime对象。 这个问题的答案似乎有一些代码: 在iphone编程中文件上传到HTTP服务器
您完全控制客户端的另一个选择是执行HTTP PUT请求。 这实际上看起来更接近您使用原始代码所做的事情。 将方法更改为“PUT”,并且不要在另一端使用Django表单; 只需访问request.raw_post_data即可获取完整的文件数据。
以上是关于将文件从iPhone上传到Django的主要内容,如果未能解决你的问题,请参考以下文章
如何将图像、pdf、音频、视频和任何文件系统从 iphone 本地内存上传到服务器(API)