enctype='multipart/form-data'HTML表单中的含义是什么?我们何时应该使用它?
当我提交一个附加文件的简单表格时:
<form enctype="multipart/form-data" action="http://localhost:3000/upload?upload_progress_id=12344" method="POST">
<input type="hidden" name="MAX_FILE_SIZE" value="100000" />
Choose a file to upload: <input name="uploadedfile" type="file" /><br />
<input type="submit" value="Upload File" />
</form>
Run Code Online (Sandbox Code Playgroud)
它是如何在内部发送文件的?该文件是作为数据发送的HTTP主体的一部分吗?在此请求的标头中,我没有看到与文件名相关的任何内容.
我只是想知道发送文件时HTTP的内部工作原理.
我已经写了一段时间的iPhone应用程序,将数据发送到服务器,接收数据(通过HTTP协议),而不用考虑太多.大多数情况下,我理论上熟悉流程,但我不太熟悉的部分是HTTP多部分请求.我知道它的基本结构,但它的核心是我.
似乎每当我发送不同于纯文本(如照片,音乐)的东西时,我都必须使用多部分请求.有人可以简单地向我解释为什么使用它以及它的优点是什么?
如果我使用它,为什么以这种方式发送照片更好?
我想知道是否有人可以与我分享一个包含以下内容的multipart/form-data示例:
我知道有类似的东西multiparty,busboy而且强大.我想知道有没有机会上传没有它们的文件.
例如,我有一个用户实体,包括用户名,电话号码和地址.我想从csv文件中读取所有这些字段并将其存储在数据库中的相应表中?
任何人都可以通过描述如何做到这一点来帮助我吗?或者有没有关于如何做到这一点的文件?
我想POST向休息端点发送请求。其余端点文档说:
创建一个节点并将其添加为节点nodeId 的主要子节点。
该端点支持JSON和multipart/form-data(文件上传)。
使用多部分/表单数据
使用filedata字段来表示要上传的内容,例如,以下curl命令将在测试用户的主文件夹中创建一个包含test.txt内容的节点。
curl -utest:测试 -X POST 主机:port/alfresco/api/-default-/public/alfresco/versions/1/nodes/-my-/children -F filedata=@test.txt
您可以使用名称字段为新文件指定替代名称。
您可以使用 nodeType 字段来创建特定类型。默认为 cm:内容
我设法通过以下代码向此端点发送正确的请求:
@Override
public ResponseEntity<byte[]> postNode(String nodeId, byte[] content) {
MultiValueMap<String, Object> bodyMap = new LinkedMultiValueMap<>();
ByteArrayResource contentsAsResource = new ByteArrayResource(content) {
@Override
public String getFilename() {
return "name22222";
}
};
bodyMap.add("filedata", contentsAsResource);
///bodyMap.add("filedata", content);// why this does not work??!
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.MULTIPART_FORM_DATA);
HttpEntity<MultiValueMap<String, Object>> requestEntity = new HttpEntity<>(bodyMap, headers);
return restTemplate.exchange("/nodes/{nodeId}/children", HttpMethod.POST, requestEntity, byte[].class, nodeId); …Run Code Online (Sandbox Code Playgroud) 我有一个 django 文件模型,它有一个 models.FileField 字段和一个用于将文件上传到服务器的表单:
class UploadFile(model.Model):
filename = models.FileField(upload_to='uploads')
description = models.CharField(max_length=38, blank=True)
class UploadFileForm(ModelForm):
class Meta:
model = UploadFile
fields = ('filename', 'description')
Run Code Online (Sandbox Code Playgroud)
视图函数如下所示:
def upload_file(request):
if request.method == 'POST':
form = UploadFileForm(request.POST, request.FILES)
if form.is_valid():
new_file = form.save()
Run Code Online (Sandbox Code Playgroud)
现在我想要一个仅使用标准库的 python 脚本,使用上面的视图函数将文件上传到 UploadFile 模型。但是,此代码不起作用,因为 POST 请求没有 FILES 方法。
import urllib, urllib2
data = urllib.urlencode({'filename': open(uploadfile, "rb"),
'description': 'upload test'})
post_req = urllib2.Request(upload_file_url, data)
result = urllib2.urlopen(post_req)
Run Code Online (Sandbox Code Playgroud)
如何将 FILES 方法添加到 POST 请求以使用 python 脚本上传文件?我还尝试编写一个不使用表单的不同视图函数,但它也不起作用。